12

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

提前致谢。

4

8 回答 8

8

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

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

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

于 2011-04-06T21:40:32.110 回答
5

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

看看这里: QHeaderView::ResizeToContents

希望能帮助到你 !

于 2010-10-27T08:26:50.293 回答
3

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

于 2010-10-27T14:25:30.230 回答
2

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

于 2010-10-29T15:21:50.047 回答
2

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

于 2010-10-27T17:31:17.873 回答
2

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

于 2019-02-26T18:43:53.487 回答
0

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

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

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

self.model.setRowCount(80000)

我确定您可以将其与您的代码相匹配

于 2013-12-28T00:50:56.547 回答
0

尝试这个 :

             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();
                 }
于 2016-08-10T08:59:08.587 回答