如何使用计时器正确更新 QTableView?

Posted

技术标签:

【中文标题】如何使用计时器正确更新 QTableView?【英文标题】:How to correctly update QTableView using timer? 【发布时间】:2014-02-24 08:45:26 【问题描述】:

我使用 C++、Qt 4.8.5、Visual Studio 2010、SQLite。我有一个基于 Qt 的 GUI 应用程序,其中包含 QTableView。该程序分析一些数据并更改一些单元格而不添加/删除行。我使用 QTimer 刷新 QTableView 使用 OnManualSubmit 模式。即使没有修改,在模型的计时器槽中多次调用submitAll() 方法是否安全?如果submitAll() 失败,那么我是否必须手动调用我的模型的select() 方法? SQLite 的行提取怎么样 - 在submitAll() 调用之后我是否需要它来观察第 257 行和更多行中单元格的修改?

有时我在第二次'submitAll()' 调用后遇到最后一个错误,例如“参数计数不匹配”(QSqlError::StatementError)。可能的原因是什么?该程序是多线程的,工作线程向主线程发送数据。计时器每 3 秒触发一次(更改被缓冲)。它不是QTableView 中的即时单元格更新。

【问题讨论】:

【参考方案1】:

您不应该直接更新您的视图(或通过计时器 - 这是一个很大的开销)。您必须在模型中的每个数据更改时调用emit dataChanged( ... );。但是如果你想要一个肮脏的黑客,你可以简单地调用(从模型)'emit dataChanged(QModelIndex(),QModelIndex());'当您需要更新视图时。

【讨论】:

程序是多线程的,工作线程将数据发送到主线程进行显示。立即显示每个微小的单元格更新不会使 GUI 响应,这就是我不得不切换到手动提交模式的原因。 多线程不影响 ui 性能。它增加它。只需将必要的数据放入您的单元格(来自任何线程)并调用emit dataChanged()。如果你有一些性能问题,你应该分析你的代码。

以上是关于如何使用计时器正确更新 QTableView?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地选择符合某些条件的 QTableView 行的子集?

如何在 Qt5 中触发 QTableView 的重绘?

如何使用 QSortFilterProxy 更新 QTableView 的 rowCount?

如何使用QCombobox选择更新QTableView单元?

将整个文件读取到 QStandardItemModel 后更新 QTableView

如何使用 beginMoveRows 在 QTableView (QAbstractTableModel) 中移动一行?