Qt数据库 QSqlTableModel实例操作

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. #include
  4. #include
  5. #include
  6. static bool createConnection()
  7. {
  8. QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
  9. db.setDatabaseName(“database.db”);
  10. if(!db.open()) return false;
  11. QSqlQuery query;
  12. query.exec(QObject::tr(“create table student (id int primary key, name vchar)”));
  13. query.exec(QObject::tr(“insert into student values (0,’刘明’)”));
  14. query.exec(QObject::tr(“insert into student values (1,’陈刚’)”));
  15. query.exec(QObject::tr(“insert into student values (2,’王红’)”));
  16. return true;
  17. }
  18. #endif // DATABASE_H
或者分开写,一个用来建立数据库,一个用来创建表格:
static bool createConnection()

{

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

db.setDatabaseName("database.db");

if(!db.open()) return false;


return true;

}


void createFakeData()

{

QSqlQuery query;

query.exec("create table student (id int primary key, name vchar)");

query.exec("insert into student values (0,'yafei0')");

query.exec("insert into student values (1,'yafei1')");

query.exec("insert into student values (2,'yafei2')");


}


为了在数据库中能使用中文,我们使用了QObject类的tr()函数。而在下面的main()函数中我们也需要添加相应的代码来支持中文。
然后将main.cpp的文件更改如下:

  1. #include
  2. #include “widget.h”
  3. #include “database.h”
  4. #include
  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();
  14. }

应该首先去判断这个数据库表格是不是已经存在了,不存在再去创建表格

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());


bool create = !QFile::exists("student.dat");

if(create)

createFakeData();


if(!createConnection())

return 1;



Widget w;

w.show();


return a.exec();

}





下面我们打开widget.ui,设计界面如下:
Qt数据库 QSqlTableModel实例操作
文章图片

其中的部件有Table View 和 Line Edit,其余是几个按钮部件。
然后在widget.h中加入头文件: #include
在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. }
  12. }
【Qt数据库 QSqlTableModel实例操作】 这里用到了事务操作,真正起提交操作的是model->submitAll()一句,它提交所有更改。

    推荐阅读