QSqlQuery和QSqlTableModel区别
QSqlQuery | QSqlTableModel |
---|---|
支持全部SQL操作 | 仅支持一些基础的操作 |
手动输入SQL命令 | 简化后的QT命令 |
使用WHERE命令筛选 | 使用内置的setFilter()模式 |
可用在多个数据库之间切换 | 只能绑定单个数据库 |
query是之间把sql命令写到代码里执行
QSqlQuery query;
query.exec("SELECT name, age FROM students WHERE class = '1'");
通过读取query.next()查看数据库返回的文本。
while (query.next()) {
QString name = query.value(0).toString();
int age = query.value(1).toInt();
qDebug() << name << age;
}
而QSqlTableModel是一种MVC(Model, View, Control 模型,显示,控制)架构的类。在使用MVC架构分层的程序里使用起来很方便,分层后Model负责和数据库通讯,View负责QT中的ui显示,而Control负责控制用户输入到Model修改中间这个环节。架构分层后不会直接对数据库进行操作,而是操作Model,系统在合适的时候在通过Model操作数据库。
混合使用QSqlTableModel和QSqlQuery导致冲突
经本人测试发现,如果即使用
sqlmodel->setTable(tableName);
sqlmodel->select();
的同时使用
query.exec("SELECT Time FROM sqltable");
多次切换后会出现不成功现象,通过QSqlError可用读取报错信息。
QSqlTableModel 和 独立设置信号槽冲突
经本人测试发现,QSqlTableModel如果预先设置了
sqlmodel->setTable(tableName);
sqlmodel->select();
tableView->setModel(&sqlmodel);
再对QSqlTableModel使用信号槽链接,会导致submitAll()提交成功但是数据库实际上没更新的情况。
connect(testModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(testModelUpdatedSlot()));
两者不能同时使用,查阅一些资料说setModel已经是信号槽链接了,再连接一个信号槽会出现错误。