我有一个3000行8列的表。我使用QTableView。要插入我做的项目:
QStandardItem* vSItem = new QStandardItem();
vSItem->setText("Blabla");
mModel->setItem(row, column, vSItem);
其中mModel是QStandardItemModel。如果我没有很多行,一切都很好,但是当我想要显示大数据(大约3000行)时,它非常慢(在Win 7 64位上有20秒(8核的机器有8 GB RAM! !!))。我能做些什么来提高性能吗?
提前致谢。
很好地调用自动调整列或行的内容。
我有一个函数,每次客户端连接到我的服务器应用程序时,都会向表中添加一列。随着表中列数的增加,插入时间似乎越来越长。
我正在做一个ui-> messageLog-> resizeRowsToContents();每一次。我将此更改为仅自动调整正在添加的行ui-> messageLog-> resizeRowToContents(0);,并且缓慢消失。
我找到了一个解决方案:问题是我已经在构造函数中将模型分配给tableview。因此,每次我在模型中插入项目时,都会通知tableview并且可能已更新。现在我只有在用数据填充模型后才将模型分配给tableview。这不是一个优雅的解决方案,但它有效。是否有一种方法可以暂时禁用tableview中的模型或者对tableview说不关心模型中的更改的内容?
对于这些数据量,您可以更好地使用自定义模型 - 例如,您可以控制何时通知更新视图。由于现代硬件速度快,“标准”项目可扩展到数百种,甚至数千种,但它们明确记录为不适用于此大小的数据集。
此外,如果所有行都具有相同的高度,则将http://doc.qt.io/qt-5/qtreeview.html#uniformRowHeights-prop设置为true可以提高性能。就我而言,包含大约50.000行的模型几乎无法使用uniformRowHeights设置为false(默认值)。将其改为true后,它就像一个魅力。
试试这个 :
QSqlDatabase db =QSqlDatabase::addDatabase( "QSQLITE");
void SELECT_TO_TBLWID(QTableWidget * TBL, QString DbPath,QString SQL)
{
QSqlDatabase db2 =QSqlDatabase::database();
db2.setDatabaseName(DbPath);
if( !db2.open() )
{
qDebug() << db2.lastError();
qFatal( "Failed to connect." );
}
QSqlQuery qry;
qry.prepare(SQL);
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
QSqlRecord rec = qry.record();
TBL->setColumnCount(rec.count());
int RW=0;
for( int r=0; qry.next(); r++ )
{RW++;}
TBL->setRowCount(RW);
for (int pr=RW;qry.previous();pr--){// do nothing}
for( int r=0; qry.next(); r++ )
{
for( int c=0; c<rec.count(); c++ )
{
if ( r==0)
{
TBL->setHorizontalHeaderItem(c,new QTableWidgetItem(rec.fieldName(c)));
}
TBL->setItem(r, c, new QTableWidgetItem(qry.value(c).toString()));
}
}
}
db2.close();
}
我正在使用80000行,并且在向表中添加大量项目时遇到了类似的问题。
我的解决方案是让它通过告诉它需要多少行来分配高级内存。
我使用的是Qtableview和模型,所以:
self.model.setRowCount(80000)
我相信你可以将它与你的代码相匹配
注意setSectionResizeMode()。这对我来说具有巨大的性能影响。它会导致每次修改(即每个setData()/ setText()调用)的行和列大小重新计算。在我达到1000多行之前,这一点并不明显。考虑使用resizeSections()代替,这似乎是一次性调整。