有一个QSqlTableModel的子类。
class TaskManager : public QSqlTableModel
{
Q_OBJECT
public:
explicit TaskManager(QObject *parent = 0){}
void initMode();
bool addTask(Task &task);
...
}
这是initModel()
void TaskManager::initModel()
{
setTable(currenttasks);
setEditStrategy(QSqlTableModel::OnFieldChange);
select();
}
这是addTask方法
bool TaskManager::addTask(Task &task)
{
QSqlQuery query;
query.prepare("INSERT INTO currenttasks (description, numbers, imageid) "
"VALUES (:descr, :numbers, :imageid)");
query.bindValue(":descr", task.description);
query.bindValue(":numbers", task.numbers);
query.bindValue(":imageid", task.imageid);
bool res = query.exec();
reset();
return res;
}
还有一个关于QML的观点。但是,如果我点击“ADD”按钮调用addTask()方法我无法看到结果。视图未重绘。还有一个从QAbstractProxyModel继承的代理QMLifyProxyModel,但我不相信这是问题所在。 当我重新启动应用程序时,我可以看到DB中的更改。 似乎模型在更新后没有读取数据。
顺便说一下,我试图在查询后发出layoutChanged(),没有结果。 我需要做什么才能在视图中立即获得新记录? 感谢。
答案 0 :(得分:1)
是的,我知道这是一个老问题,但我会回答以后可能需要的任何问题。
据我所知,从代码中可以看出QSqlQuery只会更新数据库而不是模型。
我会使用QSqlTableModel的功能:
bool TaskManager::addTask(Task &task)
{
QSqlRecord record = this->record();
record.setValue("description", task.description);
record.setValue("numbers", task.numbers);
record.setValue("imageid", task.imageid);
// -1 means append
return insertRecord(-1, record);
}
在位置行插入记录。如果row为负数,则记录将附加到末尾。在内部调用insertRows()和setRecord()。 如果可以插入记录,则返回true,否则返回false。 立即为OnFieldChange和OnRowChange提交更改。失败不会在模型中留下新行。
这应该可以完成更新数据库和模型的所有魔力。
答案 1 :(得分:0)
根据QMLifyProxyModel的文档,它表示在更改源模型时它尚不支持更新模型。 因此,如果您使用QMLifyProxyModel从QSqlTableModel转换到QML ListView,那么这可能是您查看未刷新的原因。