我有一个包含3000行和8列的表格。我使用QTableView。 要插入我执行的项目:
QStandardItem* vSItem = new QStandardItem();
vSItem->setText("Blabla");
mModel->setItem(row, column, vSItem);
其中mModel是QStandardItemModel。 如果我没有很多行,但是当我试图想象大的时候,一切都很好 数据(大约3000行),然后它非常慢(在Win 7 64位(8核机器,8 GB RAM !!!)上20秒)。 我有什么办法可以改善表现吗?
提前致谢。
答案 0 :(得分:8)
很好地调用自动调整列或行的内容。
我有一个函数,每次客户端连接到我的服务器应用程序时都会向表中添加一列。随着表中列数的增加,插入时间似乎越来越长。
我正在做一个ui-> messageLog-> resizeRowsToContents();每一次。我将此更改为仅自动调整正在添加的行ui-> messageLog-> resizeRowToContents(0);,并且缓慢消失。
答案 1 :(得分:3)
我找到了一个解决方案:问题是我将模型分配给了tableview 已经在构造函数中。所以每当我在模型中插入项目时, tableview获悉并可能已更新。现在我将模型分配给 只有在我用模型填充模型之后才能查看tableview 这不是一个优雅的解决方案,但它有效。有没有办法暂时 从tableview或对tableview说的内容禁用模型 不关心模型的变化吗?
答案 2 :(得分:2)
答案 3 :(得分:2)
对于这一数量的数据,您可以更好地使用自定义模型 - 例如,您可以控制何时通知更新视图。由于现代硬件速度快,“标准”项目可扩展到数百个,甚至数千个,但它们明确记录为不适用于此大小的数据集。
答案 4 :(得分:2)
此外,如果您的所有行都具有相同的高度,则将http://doc.qt.io/qt-5/qtreeview.html#uniformRowHeights-prop设置为true可以提高性能。就我而言,包含大约50.000行的模型几乎无法使用uniformRowHeights设置为false(默认值)。在将其改为true后,它就像一个魅力。
答案 5 :(得分:1)
试试这个:
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();
}
答案 6 :(得分:0)
我正在使用80000行,并且在向表中添加大量项目时遇到了类似的问题。
我的解决方案是让它通过告诉它需要多少行来分配高级内存。
我使用的是Qtableview和模型,所以:
self.model.setRowCount(80000)
我相信你可以将它与你的代码相匹配
答案 7 :(得分:0)
当心setSectionResizeMode()。这对我有巨大的性能影响。每次修改都会导致行和列大小的重新计算(即每次setData()/ setText()调用)。直到我到达1000行以上时,这才引起注意。考虑使用resizeSections()代替,这似乎是一次调整。