【问题标题】:QTableWidget resizeRowsToContents very SLOWQTableWidget resizeRowsToContents 非常慢
【发布时间】:2020-06-06 17:44:43
【问题描述】:

我有一个包含超过 200.000 行和 8 列的 QTableWidget。 列具有固定大小。 行的大小可变。 将项目添加到表中很快(几秒钟)。

那么 resizeRowsToContents() 的调用大约需要 60/120 秒!我看到这个调用是单线程的! (只有一个核心有效)。 我可以强制多线程吗? 如何加快行大小调整?

谢谢你, 齐射

【问题讨论】:

    标签: performance qt resize row qtablewidget


    【解决方案1】:

    如果您想要更快的速度,请使用 QAbstractTableModel 而不是 QTableWidget 并覆盖所需的函数。这是一个简单而好的例子: https://doc.qt.io/qt-5/modelview.html

    【讨论】:

      【解决方案2】:

      您可能会尝试的一件事是使用QTableWidget::resizeRowToContents(注意:Row 而不是Rows)逐行更新QTableWidget,更新与队列中的其他事件交错。总体而言,该过程仍将花费相同的时间,但您的 GUI 将在此过程中保持响应。

      首先,利用具有零超时的QTimer 将在事件队列变空时发出其超时信号这一事实。所以代码如...

      QTimer::singleShot(0, &my_callback);
      

      将有效地等待事件队列为空,然后调用my_callback。如果my_callback 调用同一行代码,那么您将拥有一个在下一个空闲期间自动调用自身的函数。

      现在写函数...

      void resize_row (QTableWidget *view, int row, int count = 1)
      {
      
          /*
           * Resize rows `row' -> `row + count - 1'
           */
          for (int todo = count; row < view->rowCount() && todo--; ++row) {
              view->resizeRowToContents(row);
          }
      
          /*
           * If there are still rows remaining then reschedule.
           */
          if (row < view->rowCount()) {
              QTimer::singleShot(0, [=](){ resize_row(view, row, count); });
          }
      }
      

      这将在 [row, row + count) 范围内的所有行上调用 view-&gt;resizeRowToContents(...)。如果行索引仍然小于行计数,它将使用更新的参数为下一个空闲期自行安排。

      现在,替换...

      table_widget->resizeRowsToContents();
      

      与...

      QTimer::singleShot(0, [table_widget, row = 0](){ resize_row(table_widget, row, 10); });
      

      在我完成的基本测试中似乎运行良好。

      【讨论】:

        【解决方案3】:

        调整大小必须重新计算,每行高度和调整。我不建议在单个 QTableWidget 中包含这么多行。我会为这个长列表选择分页技术或一些动态加载功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-22
          • 1970-01-01
          • 2017-12-12
          • 2015-06-14
          • 2013-05-14
          • 2016-12-29
          • 2021-05-24
          • 1970-01-01
          相关资源
          最近更新 更多