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

时间:2010-10-27 08:20:18

标签: qt qtableview

我有一个包含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秒)。 我有什么办法可以改善表现吗?

提前致谢。

8 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:3)

我找到了一个解决方案:问题是我将模型分配给了tableview 已经在构造函数中。所以每当我在模型中插入项目时, tableview获悉并可能已更新。现在我将模型分配给 只有在我用模型填充模型之后才能查看tableview 这不是一个优雅的解决方案,但它有效。有没有办法暂时 从tableview或对tableview说的内容禁用模型 不关心模型的变化吗?

答案 2 :(得分:2)

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

看看这里: QHeaderView::ResizeToContents

希望它有所帮助!

答案 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()代替,这似乎是一次调整。