Qt数据库 QSqlQueryModel实例操作

Qt数据库 QSqlTableModel实例操作是本文所介绍的内容,我们先来看内容。在上一篇我们讲到只读的QSqlQueryModel也可以使其可编辑,但是很麻烦。Qt提供了操作单表的QSqlTableModel,如果我们需要对表的内容进行修改,那么我们就可以直接使用这个类。

相关联文章:

Qt数据库 QSqlQueryModel实例操作 上篇

Qt数据库 QSqlQueryModel实例操作 下篇

QSqlTableModel,该类提供了一个可读写单张SQL表的可编辑数据模型。我们下面就对其的几个常用功能进行介绍,分别是修改,插入,删除,查询,和排序。

在开始讲之前,我们还是新建Qt4 Gui Application工程,我这里工程名为tableModel ,然后选中QtSql模块,Base class选QWidget。工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:

 
 
  1. #ifndef DATABASE_H  
  2. #define DATABASE_H  
  3.  
  4. #include <QSqlDatabase> 
  5. #include <QSqlQuery> 
  6. #include <QObject> 
  7. static bool createConnection()  
  8. {  
  9.     QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);  
  10.     db.setDatabaseName(“database.db”);  
  11.     if(!db.open()) return false;  
  12.     QSqlQuery query;  
  13.     query.exec(QObject::tr(“create table student (id int primary key, name vchar)”));  
  14.     query.exec(QObject::tr(“insert into student values (0,’刘明’)”));  
  15.     query.exec(QObject::tr(“insert into student values (1,’陈刚’)”));  
  16.     query.exec(QObject::tr(“insert into student values (2,’王红’)”));  
  17.     return true;  
  18. }  
  19. #endif // DATABASE_H 

为了在数据库中能使用中文,我们使用了QObject类的tr()函数。而在下面的main()函数中我们也需要添加相应的代码来支持中文。

然后将main.cpp的文件更改如下:

 
 
  1. #include <QtGui/QApplication> 
  2. #include “widget.h”  
  3. #include “database.h”  
  4. #include <QTextCodec> 
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
  9.     if(!createConnection())  
  10.         return 1;  
  11.     Widget w;  
  12.     w.show();  
  13.     return a.exec();  

下面我们打开widget.ui,设计界面如下:

Qt数据库 QSqlTableModel实例操作

其中的部件有Table View 和 Line Edit,其余是几个按钮部件。

然后在widget.h中加入头文件: #include <QSqlTableModel>

在private中声明对象:QSqlTableModel *model;

因为我们要在不同的函数中使用model对象,所以我们在这里声明它。

我们到widget.cpp文件中的构造函数里添加如下代码:

 
 
  1. model = new QSqlTableModel(this);  
  2. model->setTable(“student”);  
  3. model->setEditStrategy(QSqlTableModel::OnManualSubmit);  
  4. model->select(); //选取整个表的所有行  
  5. // model->removeColumn(1); //不显示name属性列,如果这时添加记录,则该属性的值添加不上  
  6. ui->tableView->setModel(model);  
  7. // ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);   //使其不可编辑 

此时运行程序,效果如下:

Qt数据库 QSqlTableModel实例操作

可以看到,这个模型已经完全脱离了SQL语句,我们只需要执行select()函数就能查询整张表。上面有两行代码被注释掉了,你可以取消注释,测试一下它们的作用。

第一,修改操作。

1.我们进入“提交修改”按钮的单击事件槽函数,修改如下:

 
 
  1. void Widget::on_pushButton_clicked() //提交修改  
  2. {  
  3.     model->database().transaction(); //开始事务操作  
  4.     if (model->submitAll()) {  
  5.         model->database().commit(); //提交  
  6.     } else {  
  7.         model->database().rollback(); //回滚  
  8.         QMessageBox::warning(this, tr(“tableModel”),  
  9.                              tr(“数据库错误: %1″)  
  10.                              .arg(model->lastError().text()));  
  11.     }  

这里用到了事务操作,真正起提交操作的是model->submitAll()一句,它提交所有更改。

2、进入“撤销修改”按钮单击事件槽函数,并更改如下:

 
 
  1. void Widget::on_pushButton_2_clicked() //撤销修改  
  2. {  
  3.      model->revertAll();  

它只有简单的一行代码。

我们需要在widget.cpp文件中添加头文件:

 
 
  1. #include <QMessageBox> 
  2. #include <QSqlError> 

此时运行程序,效果如下:

Qt数据库 QSqlTableModel实例操作

我们将“陈刚”改为“李强”,如果我们点击“撤销修改”,那么它就会重新改为“陈刚”,而当我们点击“提交修改”后它就会保存到数据库,此时再点击“撤销修改”就修改不回来了。

可以看到,这个模型可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略:

 
 
  1. model->setEditStrategy(QSqlTableModel::OnManualSubmit); 

OnManualSubmit表明我们要提交修改才能使其生效。

第二,查询操作。

1.我们进入“查询”按钮的单击事件槽函数,更改如下:

 
 
  1. void Widget::on_pushButton_7_clicked() //查询  
  2. {  
  3.     QString name = ui->lineEdit->text();  
  4.     model->setFilter(QObject::tr(“name = ‘%1′”).arg(name)); //根据姓名进行筛选  
  5.     model->select(); //显示结果  

我们使用setFilter()函数进行关键字筛选,这个函数是对整个结果集进行查询。为了使用变量,我们使用了QObject类的tr()函数。

2.我们进入“返回全表”按钮的单击事件槽函数,更改如下:

 
 
  1. void Widget::on_pushButton_8_clicked() //返回全表  
  2. {  
  3.     model->setTable(“student”);   //重新关联表  
  4.     model->select();   //这样才能再次显示整个表的内容  

为了再次显示整个表的内容,我们需要再次关联这个表。

运行效果如下:

Qt数据库 QSqlTableModel实例操作

我们输入一个姓名,点击“查询”按钮后,就可以显示该记录了。再点击“返回全表”按钮则返回。

第三,排序操作。

我们分别进入“按id升序排列”和“按id降序排列”按钮的单击事件槽函数,更改如下:

 
 
  1. void Widget::on_pushButton_5_clicked() //升序  
  2. {  
  3.     model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列  
  4.     model->select();  
  5. }  
  6. void Widget::on_pushButton_6_clicked() //降序  
  7. {  
  8.     model->setSort(0,Qt::DescendingOrder);  
  9.     model->select();  

我们这里使用了setSort()函数进行排序,它有两个参数,第一个参数表示按第几个属性排序,表头从左向右,最左边是第0个属性,这里就是id属性。第二个参数是排序方法,有升序和降序两种。

运行程序,效果如下:

Qt数据库 QSqlTableModel实例操作

这是按下“按id降序排列”按钮后的效果。

第四,删除操作。

我们进入“删除选中行”按钮单击事件槽函数,进行如下更改:

 
 
  1. void Widget::on_pushButton_4_clicked() //删除当前行  
  2. {  
  3.     int curRow = ui->tableView->currentIndex().row();  
  4.     //获取选中的行  
  5.     model->removeRow(curRow);  
  6.     //删除该行  
  7.     int ok = QMessageBox::warning(this,tr(“删除当前行!”),tr(“你确定”  
  8.                                                            “删除当前行吗?”),  
  9.                          QMessageBox::Yes,QMessageBox::No);  
  10.     if(ok == QMessageBox::No)  
  11.     {  
  12.        model->revertAll(); //如果不删除,则撤销  
  13.     }  
  14.     else model->submitAll(); //否则提交,在数据库中删除该行  

这里删除行的操作会先保存在model中,当我们执行了submitAll()函数后才会真正的在数据库中删除该行。这里我们使用了一个警告框来让用户选择是否真得要删除该行。

运行效果如下:

Qt数据库 QSqlTableModel实例操作

我们点击第二行,然后单击“删除选中行”按钮,出现了警告框。这时你会发现,表中的第二行前面出现了一个小感叹号,表明该行已经被修改了,但是还没有真正的在数据库中修改,这时的数据有个学名叫脏数据(Dirty Data)。当我们按钮“Yes”按钮后数据库中的数据就会被删除,如果按下“No”,那么更改就会取消。

第五,插入操作。

我们进入“添加记录”按钮的单击事件槽函数,更改如下:

 
 
  1. void Widget::on_pushButton_3_clicked() //插入记录  
  2. {  
  3.     int rowNum = model->rowCount(); //获得表的行数  
  4.    int id = 10;  
  5.     model->insertRow(rowNum); //添加一行  
  6.     model->setData(model->index(rowNum,0),id);  
  7.     //model->submitAll(); //可以直接提交  

我们在表的最后添加一行,因为在student表中我们设置了id号是主键,所以这里必须使用setData函数给新加的行添加id属性的值,不然添加行就不会成功。这里可以直接调用submitAll()函数进行提交,也可以利用“提交修改”按钮进行提交。

运行程序,效果如下:

Qt数据库 QSqlTableModel实例操作

按下“添加记录”按钮后,就添加了一行,不过在该行的前面有个星号,如果我们按下“提交修改”按钮,这个星号就会消失。当然,如果我们将上面代码里的提交函数的注释去掉,也就不会有这个星号了。

可以看到这个模型很强大,而且完全脱离了SQL语句,就算你不怎么懂数据库,也可以利用它进行大部分常用的操作。我们也看到了,这个模型提供了缓冲区,可以先将修改保存起来,当我们执行提交函数时,再去真正地修改数据库。当然,这个模型比前面的模型更高级,前面讲的所有操作,在这里都能执行。

本文章原创于www.yafeilinux.com

小结:Qt数据库 QSqlTableModel实例操作的内容介绍完了,希望本文读你有所帮助,耕读资料请参考编辑推荐。

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
`QSqlQueryModel`是一个用于在Qt中显示数据库查询结果的模型类。它本身并不提供直接改变列宽度的方法,因为它是一个数据模型,负责提供数据,而不涉及视图的显示。 要改变`QSqlQueryModel`在`QTableView`中的列宽度,你可以通过设置`QHeaderView`来实现。下面是一个示例代码,展示了如何改变列宽度: ```cpp #include <QTableView> #include <QHeaderView> #include <QSqlQueryModel> // 创建一个QSqlQueryModel对象 QSqlQueryModel* model = new QSqlQueryModel(this); // 设置查询语句或执行查询等操作 // 获取TableView的指针 QTableView* tableView = ui->tableView; // 设置模型 tableView->setModel(model); // 获取Horizontal Header的指针 QHeaderView* header = tableView->horizontalHeader(); // 设置第一列的宽度为100像素 header->resizeSection(0, 100); ``` 在上述示例中,我们首先创建了一个`QSqlQueryModel`对象,并设置了查询语句或执行了查询操作来获取数据。然后,我们获取了一个`QTableView`的指针,并将模型设置为该TableView的模型。接下来,获取到了Horizontal Header的指针,通过`tableView->horizontalHeader()`获取。最后,使用`resizeSection`方法来设置特定列的宽度。 你可以根据需要多次调用`resizeSection`方法以改变多个列的宽度。 通过这种方式,你可以在使用`QSqlQueryModel`时改变列宽度。请确保在调用上述代码之前,模型已经被设置和填充了数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值