我使用C ++ / Qt 4.8,Microsoft Visual Studio 2010,SQLite 3.8.1。我的GUI应用程序包含几个线程:默认的GUI线程,主线程,一些工作线程。主线程处理工作线程。工作人员发出信号,要求主人更新SQLite数据库中表格的某些单元格。
因此,有2个数据库连接:1个用于GUI线程,QTableView
,QSqlTableModel
后代,1个用于主线程。主发出信号,要求GUI线程更新QTableView
。考虑到SQLite行计数问题(需要canFetchMore()),如何更新QTableView
?我不希望update_slot()是计算密集型的。主线程仅生成“UPDATE表”查询。我应该更新没有SQL的表,以便发出dataChanged
信号吗?我已经读过QSqlTableModel
是QSqlQuery
的高级替代方法,用于导航和修改单个SQL表。它通常会导致代码减少,并且不需要SQL语法知识
我遇到过这样的代码来更新QTableView(SQLite不能直接获取行数):
m_result_table_model->select();
while(m_result_table_model->canFetchMore())
{
m_result_table_model->fetchMore();
}
每行更新后是否应调用此代码?当我在QCoreApplication::processEvents();
中使用update_slot()
时,我遇到了堆栈溢出异常。
答案 0 :(得分:1)
无法强制QSqlQueryModel刷新某些行。您只能清除它并按照您所描述的新数据重新填充它。如果这还不够快,您应该手动实现此行为。选项是创建自己的模型类,子类QSqlTableModel或使用QStandardItemModel。