ToB企服应用市场:ToB评测及商务社交产业平台

标题: Qt底子 | QSqlTableModel 的使用 [打印本页]

作者: 忿忿的泥巴坨    时间: 2024-8-1 04:00
标题: Qt底子 | QSqlTableModel 的使用

Qt SQL模块:


   关于 QSqlTableModel 、QSqlDatabase 、QDataWidgetMapper 类的使用可参考:Qt底子 | Qt SQL模块先容 | Qt SQL模块常用类及其常用函数先容
  一、QSqlTableModel 的使用

  这一部分使用 QSqlTableModel 表实际例数据库 demodb 中 employee 数据表的内容,实现编辑、插入、删除记录的操作,实现数据的排序和记录过滤,还实现 BLOB 范例字段 Photo 中存储照片的表现、导入等操作。
1.主窗口MainWindow类界说

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include    <QMainWindow>
  4. #include    <QLabel>
  5. #include    <QString>
  6. #include    <QtSql>
  7. #include    <QDataWidgetMapper>
  8. #include    "qwcomboboxdelegate.h"
  9. namespace Ui {
  10. class MainWindow;
  11. }
  12. class MainWindow : public QMainWindow
  13. {
  14.     Q_OBJECT
  15. private:
  16.     QSqlDatabase  DB;//数据库连接
  17.     QSqlTableModel  *tabModel;  //数据模型
  18.     QItemSelectionModel *theSelection; //选择模型
  19.     QDataWidgetMapper   *dataMapper; //数据映射
  20.     QWComboBoxDelegate   delegateSex; //自定义数据代理,性别
  21.     QWComboBoxDelegate   delegateDepart; //自定义数据代理,部门
  22.     void    openTable();//打开数据表
  23.     void    getFieldNames();//获取字段名称,填充“排序字段”的comboBox
  24. public:
  25.     explicit MainWindow(QWidget *parent = 0);
  26.     ~MainWindow();
  27. private slots:
  28.     void on_currentChanged(const QModelIndex &current, const QModelIndex &previous);
  29.         // QTableView的SelectionModel的行发生了变化,进行处理
  30.     void on_currentRowChanged(const QModelIndex &current, const QModelIndex &previous);
  31.     void on_actOpenDB_triggered();
  32.     void on_actRecAppend_triggered();
  33.     void on_actRecInsert_triggered();
  34.     void on_actRevert_triggered();
  35.     void on_actSubmit_triggered();
  36.     void on_actRecDelete_triggered();
  37.     void on_actPhoto_triggered();
  38.     void on_actPhotoClear_triggered();
  39.     void on_radioBtnAscend_clicked();
  40.     void on_radioBtnDescend_clicked();
  41.     void on_radioBtnMan_clicked();
  42.     void on_radioBtnWoman_clicked();
  43.     void on_radioBtnBoth_clicked();
  44.     void on_comboFields_currentIndexChanged(int index);
  45.     void on_actScan_triggered();
  46. private:
  47.     Ui::MainWindow *ui;
  48. };
  49. #endif // MAINWINDOW_H
复制代码
MainWindow 类中界说了几个私有变量:

私有函数:

槽函数:

2.构造函数

  MainWindow 的构造函数代码如下,重要是对 tableView 一些表现属性的设置。
  1. MainWindow::MainWindow(QWidget *parent) :
  2.     QMainWindow(parent),
  3.     ui(new Ui::MainWindow)
  4. {
  5.     ui->setupUi(this);
  6.     this->setCentralWidget(ui->splitter);
  7. //   tableView显示属性设置
  8.     ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
  9.     ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
  10.     ui->tableView->setAlternatingRowColors(true);
  11. //    ui->tableView->resizeColumnsToContents();
  12. //    ui->tableView->horizontalHeader()->setStretchLastSection(true);
  13. }
复制代码

3.打开数据表

  打开数据表这一部分重要包罗:

3.1 添加 SQLite 数据库驱动、设置数据库名称、打开数据库

  这一部分重要用到了 QSqlDatabase 类,该类用于处理与数据库的连接。
  1. void MainWindow::on_actOpenDB_triggered()
  2. {//打开数据表
  3.     QString aFile=QFileDialog::getOpenFileName(this,"选择数据库文件","",
  4.                              "SQL Lite数据库(*.db *.db3)");
  5.     if (aFile.isEmpty())  //选择SQL Lite数据库文件
  6.        return;
  7. //打开数据库
  8.     DB=QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动
  9.     DB.setDatabaseName(aFile); //设置数据库名称
  10. //    DB.setHostName();
  11. //    DB.setUserName();
  12. //    DB.setPassword();
  13.     if (!DB.open())   //打开数据库
  14.     {
  15.         QMessageBox::warning(this, "错误", "打开数据库失败",
  16.                                  QMessageBox::Ok,QMessageBox::NoButton);
  17.         return;
  18.     }
  19. //打开数据表
  20.     openTable();
  21. }
复制代码
  补充
  
  3.2 数据模型设置、选择模型、自界说代理组件、界面组件与模型数据字段间的数据映射

  这部分用到 3 个类:

这几个类之间的关系是:QTableView是界面视图组件,其关联的数据模型是 QSqlTableModel,关联的项选择模型是 QItemSelectionModel。
数据模型创建与属性设置
  1. tabModel=new QSqlTableModel(this,DB);//数据表
  2. tabModel->setTable("employee"); //设置数据表
  3. tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//数据保存方式,OnManualSubmit , OnRowChange
  4. tabModel->setSort(tabModel->fieldIndex("empNo"),Qt::AscendingOrder); //排序
  5. if (!(tabModel->select()))//查询数据
  6. {
  7.    QMessageBox::critical(this, "错误信息",
  8.           "打开数据表错误,错误信息\n"+tabModel->lastError().text(),
  9.              QMessageBox::Ok,QMessageBox::NoButton);
  10.    return;
  11. }
复制代码

表头设置
  使用 setHeaderData() 函数设置表头,即设置数据库表的字段在 tableView 中表现时的字段名称。为此,将每个字段的表现设置为相应的中文标题。
  1. [override virtual] bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)
复制代码

表头设置部分代码为:
  1.     tabModel->setHeaderData(tabModel->fieldIndex("empNo"),Qt::Horizontal,"工号");
  2.     tabModel->setHeaderData(tabModel->fieldIndex("Name"),Qt::Horizontal,"姓名");
  3.     tabModel->setHeaderData(tabModel->fieldIndex("Gender"),Qt::Horizontal,"性别");
  4.     tabModel->setHeaderData(tabModel->fieldIndex("Height"),Qt::Horizontal,"身高");
  5.     tabModel->setHeaderData(tabModel->fieldIndex("Birthday"),Qt::Horizontal,"出生日期");
  6.     tabModel->setHeaderData(tabModel->fieldIndex("Mobile"),Qt::Horizontal,"手机");
  7.     tabModel->setHeaderData(tabModel->fieldIndex("Province"),Qt::Horizontal,"省份");
  8.     tabModel->setHeaderData(tabModel->fieldIndex("City"),Qt::Horizontal,"城市");
  9.     tabModel->setHeaderData(tabModel->fieldIndex("Department"),Qt::Horizontal,"部门");
  10.     tabModel->setHeaderData(tabModel->fieldIndex("Education"),Qt::Horizontal,"学历");
  11.     tabModel->setHeaderData(tabModel->fieldIndex("Salary"),Qt::Horizontal,"工资");
  12.     tabModel->setHeaderData(tabModel->fieldIndex("Memo"),Qt::Horizontal,"备注"); //这两个字段不再tableView中显示
  13.     tabModel->setHeaderData(tabModel->fieldIndex("Photo"),Qt::Horizontal,"照片");
复制代码
创建选择模型及信号的作用
  选择模型的作用是当用户在 TableView 组件上操作时,获取当前选择的行 、列信息,而且在选择的单位格厘革时发射 currentChanged() 信号,在当前行厘革时发射 currentRowChanged() 信号。
  1. theSelection=new QItemSelectionModel(tabModel);//关联选择模型
  2. //theSelection当前项变化时触发currentChanged信号
  3. connect(theSelection,SIGNAL(currentChanged(QModelIndex,QModelIndex)),
  4.         this,SLOT(on_currentChanged(QModelIndex,QModelIndex)));
  5. //选择行变化时
  6. connect(theSelection,SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
  7.         this,SLOT(on_currentRowChanged(QModelIndex,QModelIndex)));
复制代码
对应的槽函数为:
  1. void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
  2. {//更新actPost和actCancel 的状态
  3.     Q_UNUSED(current);
  4.     Q_UNUSED(previous);
  5.     ui->actSubmit->setEnabled(tabModel->isDirty()); //有未保存修改时可用
  6.     ui->actRevert->setEnabled(tabModel->isDirty());
  7. }
  8. void MainWindow::on_currentRowChanged(const QModelIndex &current, const QModelIndex &previous)
  9. {
  10.     Q_UNUSED(previous);
  11. // 行切换时的状态控制
  12.     ui->actRecDelete->setEnabled(current.isValid());
  13.     ui->actPhoto->setEnabled(current.isValid());
  14.     ui->actPhotoClear->setEnabled(current.isValid());
  15.     if (!current.isValid())
  16.     {
  17.         ui->dbLabPhoto->clear(); //清除图片显示
  18.         return;
  19.     }
  20.     dataMapper->setCurrentIndex(current.row()); //更新数据映射到当前行,使界面上的编辑框、下拉列表框等与字段关联的界面组件显示当前记录的内容
  21.     int curRecNo=current.row();//获取行号
  22.     QSqlRecord  curRec=tabModel->record(curRecNo); //获取当前记录
  23.     if (curRec.isNull("Photo"))  //图片字段内容为空
  24.        ui->dbLabPhoto->clear();
  25.     else
  26.     {
  27.         QByteArray data=curRec.value("Photo").toByteArray();
  28.         QPixmap pic;
  29.         pic.loadFromData(data);
  30.         ui->dbLabPhoto->setPixmap(pic.scaledToWidth(ui->dbLabPhoto->size().width()));
  31.     }
  32. }
复制代码
tableView的设置
  用 QTableView 组件表现 tabModel 的表格数据内容时,需要设置其数据模型和关联选择模型,而且将 “Memo” 和 “Photo” 两个字段的列设置为隐藏,由于在表格里难以表现备注文件和图片。
  1. ui->tableView->setModel(tabModel);//设置数据模型
  2. ui->tableView->setSelectionModel(theSelection); //设置选择模型
  3. ui->tableView->setColumnHidden(tabModel->fieldIndex("Memo"),true);//隐藏列
  4. ui->tableView->setColumnHidden(tabModel->fieldIndex("Photo"),true);//隐藏列
复制代码
  自界说基于 QComboBox 的代理组件类 QWComboBoxDelegate,组件类中有一个函数 setItems() ,用于初始化下拉列表框和设置是都可以编辑,
qwcombocoxdelegate.h:
  1. #ifndef QWCOMBOBOXDELEGATE_H
  2. #define QWCOMBOBOXDELEGATE_H
  3. #include    <QStyledItemDelegate>
  4. #include    <QComboBox>
  5. class QWComboBoxDelegate : public QStyledItemDelegate
  6. {
  7.     Q_OBJECT
  8. private:
  9.     QStringList m_ItemList;//选择列表
  10.     bool    m_isEdit; //是否可编辑
  11. public:
  12.     QWComboBoxDelegate(QObject *parent=0);
  13.     void    setItems(QStringList items, bool isEdit);//初始化设置列表内容,是否可编辑
  14. //自定义代理组件必须继承以下4个函数
  15.     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
  16.                           const QModelIndex &index) const Q_DECL_OVERRIDE;
  17.     void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
  18.     void setModelData(QWidget *editor, QAbstractItemModel *model,
  19.                       const QModelIndex &index) const Q_DECL_OVERRIDE;
  20.     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
  21.                               const QModelIndex &index) const Q_DECL_OVERRIDE;
  22. };
  23. #endif // QWCOMBOBOXDELEGATE_H
复制代码
qwcombocoxdelegate.cpp:
  1. #include "qwcomboboxdelegate.h"
  2. #include    <QComboBox>
  3. QWComboBoxDelegate::QWComboBoxDelegate(QObject *parent):QStyledItemDelegate(parent)
  4. {
  5. }
  6. void QWComboBoxDelegate::setItems(QStringList items, bool isEdit)
  7. {
  8.     m_ItemList=items;
  9.     m_isEdit=isEdit;
  10. }
  11. QWidget *QWComboBoxDelegate::createEditor(QWidget *parent,
  12.        const QStyleOptionViewItem &option, const QModelIndex &index) const
  13. {
  14.     Q_UNUSED(option);
  15.     Q_UNUSED(index);
  16.     QComboBox *editor = new QComboBox(parent);
  17.     for (int i=0;i<m_ItemList.count();i++)   //从字符串列表初始下拉列表
  18.         editor->addItem(m_ItemList.at(i));
  19.     editor->setEditable(m_isEdit); //是否可编辑
  20.     return editor;
  21. }
  22. void QWComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
  23. {
  24.     QString str = index.model()->data(index, Qt::EditRole).toString();
  25.     QComboBox *comboBox = static_cast<QComboBox*>(editor);
  26.     comboBox->setCurrentText(str);
  27. }
  28. void QWComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
  29. {
  30.     QComboBox *comboBox = static_cast<QComboBox*>(editor);
  31.     QString str = comboBox->currentText();
  32.     model->setData(index, str, Qt::EditRole);
  33. }
  34. void QWComboBoxDelegate::updateEditorGeometry(QWidget *editor,
  35.                 const QStyleOptionViewItem &option, const QModelIndex &index) const
  36. {
  37.     Q_UNUSED(index);
  38.     editor->setGeometry(option.rect);
  39. }
复制代码
  创建多个代理组件实例,分别用于“性别” 和 “部分” 两个字段。
  1. //tableView上为“性别”和“部门”两个字段设置自定义代理组件
  2. QStringList strList;
  3. strList<<"男"<<"女";
  4. bool isEditable=false;
  5. delegateSex.setItems(strList,isEditable);
  6. ui->tableView->setItemDelegateForColumn(
  7.    tabModel->fieldIndex("Gender"),&delegateSex); //Combbox选择型
  8. strList.clear();
  9. strList<<"销售部"<<"技术部"<<"生产部"<<"行政部";
  10. isEditable=true;
  11. delegateDepart.setItems(strList,isEditable);
  12. ui->tableView->setItemDelegateForColumn(tabModel->fieldIndex("Department"),&delegateDepart); //Combbox选择型
复制代码
数据映射
  QDataWidgetMapper 用于建立界面组件与数据模型之间的映射,可以将界面的 QLineEdit、QCombobox 等组件与数据模型的一个字段关联起来。当数据模型关联的字段内容发生厘革时,自动更新组件的表现内容。
  1. //创建界面组件与数据模型的字段之间的数据映射
  2. dataMapper= new QDataWidgetMapper();
  3. dataMapper->setModel(tabModel);//设置数据模型
  4. dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);//
  5. //    dataMapper->setItemDelegate(new QSqlRelationalDelegate(this)); //含有外键的
  6. //界面组件与tabModel的具体字段之间的联系
  7. dataMapper->addMapping(ui->dbSpinEmpNo,tabModel->fieldIndex("empNo"));
  8. dataMapper->addMapping(ui->dbEditName,tabModel->fieldIndex("Name"));
  9. dataMapper->addMapping(ui->dbComboSex,tabModel->fieldIndex("Gender"));
  10. dataMapper->addMapping(ui->dbSpinHeight,tabModel->fieldIndex("Height"));
  11. dataMapper->addMapping(ui->dbEditBirth,tabModel->fieldIndex("Birthday"));
  12. dataMapper->addMapping(ui->dbEditMobile,tabModel->fieldIndex("Mobile"));
  13. dataMapper->addMapping(ui->dbComboProvince,tabModel->fieldIndex("Province"));
  14. dataMapper->addMapping(ui->dbEditCity,tabModel->fieldIndex("City"));
  15. dataMapper->addMapping(ui->dbComboDep,tabModel->fieldIndex("Department"));
  16. dataMapper->addMapping(ui->dbComboEdu,tabModel->fieldIndex("Education"));
  17. dataMapper->addMapping(ui->dbSpinSalary,tabModel->fieldIndex("Salary"));
  18. dataMapper->addMapping(ui->dbEditMemo,tabModel->fieldIndex("Memo"));
  19. //    dataMapper->addMapping(ui->dbPhoto,tabModel->fieldIndex("Photo")); //图片无法直接映射
  20. dataMapper->toFirst();//移动到首记录
  21. getFieldNames();//获取字段名称列表,填充ui->groupBoxSort组件
  22. //更新actions和界面组件的使能状态
  23. ui->actOpenDB->setEnabled(false);
  24. ui->actRecAppend->setEnabled(true);
  25. ui->actRecInsert->setEnabled(true);
  26. ui->actRecDelete->setEnabled(true);
  27. ui->actScan->setEnabled(true);
  28. ui->groupBoxSort->setEnabled(true);
  29. ui->groupBoxFilter->setEnabled(true);
复制代码

获取数据表的所有字段名称
  使用不带参数的 record() 函数获取数据表的所有字段名称,并添补到排序的下拉列表框中
  1. void MainWindow::getFieldNames()
  2. { //获取所有字段名称
  3.     QSqlRecord  emptyRec=tabModel->record();//获取空记录,只有字段名
  4.     for (int i=0;i<emptyRec.count();i++)
  5.         ui->comboFields->addItem(emptyRec.fieldName(i));
  6. }
复制代码
4.添加、插入与删除记录

  使用 insertRow() 函数在数据模型的 row 行前面插入一行记录,如果 row 大于或即是数据模型的总行数,则在末了添加一行记录。末了,选中刚插入的那一行记录。
  1. void MainWindow::on_actRecAppend_triggered()
  2. {//添加记录
  3.     tabModel->insertRow(tabModel->rowCount(),QModelIndex()); //在末尾添加一个记录
  4.     QModelIndex curIndex=tabModel->index(tabModel->rowCount()-1,1);//创建最后一行的ModelIndex
  5.     theSelection->clearSelection();//清空选择项
  6.     theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select);//设置刚插入的行为当前选择行
  7.     int currow=curIndex.row(); //获得当前行
  8.     tabModel->setData(tabModel->index(currow,0),2000+tabModel->rowCount()); //自动生成编号
  9.     tabModel->setData(tabModel->index(currow,2),"男");
  10. // 插入行时设置缺省值,需要在primeInsert()信号里去处理
  11. }
  12. void MainWindow::on_actRecInsert_triggered()
  13. {//插入记录
  14.     QModelIndex curIndex=ui->tableView->currentIndex();
  15.     tabModel->insertRow(curIndex.row(),QModelIndex());
  16.     theSelection->clearSelection();//清除已有选择
  17.     theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select);
  18. }
复制代码
  使用 removeRow() 函数删除选中的那一行记录。
  1. void MainWindow::on_actRecDelete_triggered()
  2. {//删除当前记录
  3.     QModelIndex curIndex=theSelection->currentIndex();//获取当前选择单元格的模型索引
  4.     tabModel->removeRow(curIndex.row()); //删除最后一行
  5. }
复制代码
在插入或删除记录操作,未提交生存之前, tableView 的左侧表头会以标记表示记录编辑状态,"*"表示新插入的记录,”!” 表示删除的记录 。在生存或取消修改,这些标记就消失,删除的记录行也从 tableView 里删除。
5.生存与取消修改

  在打开数据表初始化时,设置数据模型的编辑计谋为 OnManualSubmit,即手动提交修改。当数据模型的数据被修改后,不管是直接修改字段值,照旧插入或删除记录,在未提交修改前,QSqlTableModel::isDirty() 函数返回 true,就是使用这个函数在槽函数 on_currentChanged() 里设置 ”生存修改“和”取消修改“ 按钮的使能状态。
  使用 submitAll() 函数用于将数据表所有未提交的修改生存到数据库中;使用 revertAll() 函数来取消所有修改。
  1. void MainWindow::on_actRevert_triggered()
  2. {//取消修改
  3.     tabModel->revertAll();
  4.     ui->actSubmit->setEnabled(false);
  5.     ui->actRevert->setEnabled(false);
  6. }
  7. void MainWindow::on_actSubmit_triggered()
  8. {//保存修改
  9.     bool res=tabModel->submitAll();
  10.     if (!res)
  11.         QMessageBox::information(this, "消息", "数据保存错误,错误信息\n"+tabModel->lastError().text(),
  12.                                  QMessageBox::Ok,QMessageBox::NoButton);
  13.     else
  14.     {
  15.         ui->actSubmit->setEnabled(false);
  16.         ui->actRevert->setEnabled(false);
  17.     }
  18. }
复制代码
6.设置和清除照片

  设置照片功能是用文件对话框选择一个图片文件,读取文件内容到 QByteArray 范例的变量data里,获取当前记录到变量 curRec 后,用 QSqlRecord 的 setValue() 函数为 Photo 字段设置数据为 data,然后用 setRecord() 函数更新当前记录的数据到数据模型,并在界面组件上表现。
   留意:这里的更新只是更新到数据模型,并没有更新到数据库。
  1. void MainWindow::on_actPhoto_triggered()
  2. {
  3. //设置照片
  4.     QString aFile=QFileDialog::getOpenFileName(this,"选择图片文件","","照片(*.jpg)");
  5.     if (aFile.isEmpty())
  6.        return;
  7.     QByteArray data;
  8.     QFile* file=new QFile(aFile); //fileName为二进制数据文件名
  9.     file->open(QIODevice::ReadOnly);
  10.     data = file->readAll();
  11.     file->close();
  12.     int curRecNo=theSelection->currentIndex().row();
  13.     QSqlRecord  curRec=tabModel->record(curRecNo); //获取当前记录
  14.     curRec.setValue("Photo",data); //设置字段数据
  15.     tabModel->setRecord(curRecNo,curRec);
  16.     QPixmap pic;
  17.     pic.load(aFile);  //在界面上显示
  18.     ui->dbLabPhoto->setPixmap(pic.scaledToWidth(ui->dbLabPhoto->width()));
  19. }
复制代码
  清楚照片的功能是获取当前记录到变量 curRec 后,调用 setNull () 函数将 Photo 字段设置为 NULL,就是清除了字段的内容,然后更新记录到数据模型,并清除界面组件的表现。
  1. void MainWindow::on_actPhotoClear_triggered()
  2. {
  3.     int curRecNo=theSelection->currentIndex().row();
  4.     QSqlRecord  curRec=tabModel->record(curRecNo); //获取当前记录
  5.     curRec.setNull("Photo");//设置为空值
  6.     tabModel->setRecord(curRecNo,curRec);
  7.     ui->dbLabPhoto->clear();
  8. }
复制代码
7.数据记录的遍历

  使用 record(int index) 函数获取每一行记录,并对该行记录的值举行修改。
  1. void MainWindow::on_actScan_triggered()
  2. {//涨工资,记录遍历
  3.     if (tabModel->rowCount()==0)
  4.         return;
  5.     for (int i=0;i<tabModel->rowCount();i++)
  6.     {
  7.         QSqlRecord aRec=tabModel->record(i); //获取当前记录
  8.         float salary=aRec.value("Salary").toFloat();
  9.         salary=salary*1.1;
  10.         aRec.setValue("Salary",salary);
  11.         tabModel->setRecord(i,aRec);
  12.     }
  13. // 索引方式刷新记录,速度一样
  14. //    float   salary;
  15. //    for (int i=0;i<tabModel->rowCount();i++)
  16. //    {
  17. //        salary=tabModel->data(tabModel->index(i,10)).toFloat();
  18. //        salary=salary*1.1;
  19. //        tabModel->setData(tabModel->index(i,10),salary);
  20. //    }
  21.     if (tabModel->submitAll())
  22.         QMessageBox::information(this, "消息", "涨工资计算完毕",
  23.                              QMessageBox::Ok,QMessageBox::NoButton);
  24. }
复制代码
8.记录排序

  使用 setSort() 函数设置数据表根据某个字段按照升序或降序排列,实际上就是设置 SQL 语句里的 ORDER BY 子句。在调用 setSort() 函数设置排序规则后,需要调用 QSqITableModel::select() 重新读取数据表的数据才会使排序规则生效。
  1. void MainWindow::on_comboFields_currentIndexChanged(int index){//选择字段举行排序    if (ui->radioBtnAscend->isChecked())        tabModel->setSort(index,Qt::AscendingOrder);    else        tabModel->setSort(index,Qt::DescendingOrder);    tabModel->select()
  2. ;}void MainWindow::on_radioBtnAscend_clicked(){//升序    tabModel->setSort(ui->comboFields->currentIndex(),Qt::AscendingOrder);    tabModel->select()
  3. ;}void MainWindow::on_radioBtnDescend_clicked(){//降序    tabModel->setSort(ui->comboFields->currentIndex(),Qt::DescendingOrder);    tabModel->select()
  4. ;}
复制代码
9.记录过滤

  使用 setFilter() 函数设置记录的过滤条件,实际上就是设置 SQL 语句里的 WHERE 子句。调用 setFilter() 后无需调用 select() 函数就可以立即刷新记录,若要取消过滤条件,只需在 setFilter() 函数里传递一个空字符串。
  1. void MainWindow::on_radioBtnMan_clicked(){    tabModel->setFilter(" Gender='男' ");//    tabModel->select()
  2. ;}void MainWindow::on_radioBtnWoman_clicked(){    tabModel->setFilter(" Gender='女' ");//    tabModel->select()
  3. ;}void MainWindow::on_radioBtnBoth_clicked(){    tabModel->setFilter("");}
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4