【问题标题】:How to speed up QTableWidget如何加速 QTableWidget
【发布时间】:2013-05-28 21:29:28
【问题描述】:

我有一个QtTableWidget,有 7 列和很多行(大约 2000,但会增长到 5000 甚至更多)。

此数据是从数据库中检索的。查询和后处理耗时不到 100 毫秒,所以这不是问题。

但是对于 7x2000 个项目,在桌子上插入项目需要很长时间(大约 30 秒)。

我尝试尽可能优化代码,但我不知道该怎么做了。

另外,我必须注意,当应用程序启动时,加载同一个表,具有相同的数据集并且非常非常快。所以我认为这是一个渲染问题。

在文档中搜索阻止渲染的内容,我想出了setUpdatesEnabled 方法,但根本没有帮助。

以下是我用来建表的代码:

setUpdatesEnabled(false);
blockSignals(true);
bool sort = isSortingEnabled();
setSortingEnabled(false);
// rebuild headers.
buildHeaders(); // take less than 1ms.
// rebuild grid.
int oldRowCount = rowCount();
setRowCount(sml->length()); // take less than 1ms.
ListIterator<StoredMetadata> it(sml); // sml is a list with the data to be displayed.
int row = 0;
while ( it.hasNext() ) {
    AudioLife::StoredMetadata *sm = it.next();
    if ( row >= oldRowCount ) {
        setItem(row, 0, new QTableWidgetItem(sm->artist));
        setItem(row, 1, new QTableWidgetItem(sm->album));
        setItem(row, 2, new QTableWidgetItem(sm->name));
        setItem(row, 3, new QTableWidgetItem(sm->number > 0 ? QString().setNum(sm->number) : ""));
        setItem(row, 4, new QTableWidgetItem(sm->year > 0 ? QString().setNum(sm->year) : ""));
        setItem(row, 5, new QTableWidgetItem(sm->genre));
        // commenting the following line does not improve performance.
        verticalHeader()->resizeSection(row, defaultRowHeight());
    } else {
        item(row, 0)->setText(sm->artist);
        item(row, 1)->setText(sm->album);
        item(row, 2)->setText(sm->name);
        item(row, 3)->setText(sm->number > 0 ? QString().setNum(sm->number) : "");
        item(row, 4)->setText(sm->year > 0 ? QString().setNum(sm->year) : "");
        item(row, 5)->setText(sm->genre);
    }
    item(row, 0)->setData(Qt::UserRole, QVariant(sm->id));
    row++;
}
setUpdatesEnabled(true);
blockSignals(false);
setSortingEnabled(sort);

有人知道吗?

【问题讨论】:

  • 这是一个简单的hack setUniformRowHeights(true);这将为您赢得近 50% 的时间。我不知道为什么 :)

标签: qt qt4 qt5


【解决方案1】:

考虑为您的表格模型子类化 QSqlTableModelQSqlQueryModel 并让框架为您显示项目,而不是手动插入/设置小部件的项目

[编辑]:或者直接使用QSqlTableModel作为你的表格模型

参考:Using-QSqlTableModel-To-Display-an-SQL-viewQSQLTableModel inheritor and QTableView,以及一些示例代码here

【讨论】:

  • 我找不到任何关于如何扩展这些类的像样的教程。所以我用 Q*Widget 类构建了我的项目。如果你能指点我这方面的任何好的教程,我会很乐意重写所有需要的代码和项目细节。 Qt 以某种方式快速渲染这个东西......也许我会看看 QSqlTableModel 的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2019-03-06
  • 1970-01-01
  • 2015-01-28
  • 2021-12-18
  • 2017-04-10
相关资源
最近更新 更多