如何使用计时器正确更新 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 行的子集?
如何使用 QSortFilterProxy 更新 QTableView 的 rowCount?
如何使用QCombobox选择更新QTableView单元?
将整个文件读取到 QStandardItemModel 后更新 QTableView
如何使用 beginMoveRows 在 QTableView (QAbstractTableModel) 中移动一行?