【问题标题】:How to correctly update QTableView using timer?如何使用计时器正确更新 QTableView?
【发布时间】: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 中的即时单元格更新。

【问题讨论】:

    标签: c++ qt sqlite qtableview


    【解决方案1】:

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

    【讨论】:

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