QT混合使用QSqlTableModel和QSqlQuery引发的问题

QSqlQuery和QSqlTableModel区别

QSqlQueryQSqlTableModel
支持全部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已经是信号槽链接了,再连接一个信号槽会出现错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值