QTableView非常慢(即使只有3000行)

问题描述 投票:11回答:8

我有一个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! !!))。我能做些什么来提高性能吗?

提前致谢。

qt qtableview
8个回答
8
投票

很好地调用自动调整列或行的内容。

我有一个函数,每次客户端连接到我的服务器应用程序时,都会向表中添加一列。随着表中列数的增加,插入时间似乎越来越长。

我正在做一个ui-> messageLog-> resizeRowsToContents();每一次。我将此更改为仅自动调整正在添加的行ui-> messageLog-> resizeRowToContents(0);,并且缓慢消失。


3
投票

我找到了一个解决方案:问题是我已经在构造函数中将模型分配给tableview。因此,每次我在模型中插入项目时,都会通知tableview并且可能已更新。现在我只有在用数据填充模型后才将模型分配给tableview。这不是一个优雅的解决方案,但它有效。是否有一种方法可以暂时禁用tableview中的模型或者对tableview说不关心模型中的更改的内容?


2
投票

对于这些数据量,您可以更好地使用自定义模型 - 例如,您可以控制何时通知更新视图。由于现代硬件速度快,“标准”项目可扩展到数百种,甚至数千种,但它们明确记录为不适用于此大小的数据集。


2
投票

您是否对列或行的内容进行了自动调整大小?它有时可能成为性能的杀手!

看看这里:QHeaderView::ResizeToContents

希望能帮助到你 !


2
投票

此外,如果所有行都具有相同的高度,则将http://doc.qt.io/qt-5/qtreeview.html#uniformRowHeights-prop设置为true可以提高性能。就我而言,包含大约50.000行的模型几乎无法使用uniformRowHeights设置为false(默认值)。将其改为true后,它就像一个魅力。


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();
                 }

0
投票

我正在使用80000行,并且在向表中添加大量项目时遇到了类似的问题。

我的解决方案是让它通过告诉它需要多少行来分配高级内存。

我使用的是Qtableview和模型,所以:

self.model.setRowCount(80000)

我相信你可以将它与你的代码相匹配


0
投票

注意setSectionResizeMode()。这对我来说具有巨大的性能影响。它会导致每次修改(即每个setData()/ setText()调用)的行和列大小重新计算。在我达到1000多行之前,这一点并不明显。考虑使用resizeSections()代替,这似乎是一次性调整。

© www.soinside.com 2019 - 2024. All rights reserved.