我有一个QtTableWidget
,有7列和很多行(类似2000,但将增长到5000甚至更多)。
该数据是从数据库中检索的。查询和后处理花费的时间少于100ms,所以这不是问题。
但是在表中插入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);
有人知道吗?
考虑为表模型子类化QSqlTableModel
或QSqlQueryModel
,并让框架为您执行项显示,而不是手动插入/设置小部件的项
[Edit]:或者直接使用QSqlTableModel
作为你的表模型
参考:Using-QSqlTableModel-To-Display-an-SQL-view, QSQLTableModel继承程序和QTableView,以及这里的一些示例代码