12

3000 行と 8 列のテーブルがあります。私はQTableViewを使用しています。私が行うアイテムを挿入するには:

QStandardItem* vSItem = new QStandardItem();
vSItem->setText("Blabla");
mModel->setItem(row, column, vSItem);

mModel は QStandardItemModel です。多くの行がなければすべて問題ありませんが、大きなデータ (約 3000 行) を視覚化しようとすると、非常に遅くなります (Win 7 64 ビットで 20 秒 (8 GB の RAM を搭載した 8 コア マシン! !!)))。パフォーマンスを向上させるためにできることはありますか?

前もって感謝します。

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

解決策を見つけました。問題は、モデルをコンストラクターに既にあるテーブルビューに割り当てたことです。そのため、モデルにアイテムを挿入するたびに、テーブルビューが通知され、おそらく更新されました。モデルにデータを入力した後でのみ、モデルをテーブルビューに割り当てます。これはエレガントなソリューションではありませんが、機能します。テーブルビューからモデルを一時的に無効にする方法や、モデルの変更を気にしないようにテーブルビューに指示する方法はありますか?

于 2010-10-27T14:25:30.230 に答える
2

この量のデータについては、カスタム モデルを使用したほうがよいでしょう。たとえば、ビューに更新を通知するタイミングを制御できます。「標準」アイテムは、最新のハードウェアが高速であるため、数百、おそらく数千にスケーリングされますが、このサイズのデータ​​セットを対象としていないことが明示的に文書化されています。

于 2010-10-27T17:31:17.873 に答える
2

また、すべての行の高さが同じ場合、http://doc.qt.io/qt-5/qtreeview.html#uniformRowHeights-propを true に設定すると、パフォーマンスが向上します。私の場合、約 50.000 行を含むモデルは、uniformRowHeights を false (デフォルト) に設定するとほとんど使用できなくなりました。それをtrueに変更した後、それは魅力のように機能しました。

于 2010-10-29T15:21:50.047 に答える
2

setSectionResizeMode() に注意してください。これは、パフォーマンスに大きな影響を与えました。これにより、変更のたびに (つまり、setData()/setText() 呼び出しのたびに) 行と列のサイズが再計算されます。これは、1000 行以上に達するまで目立ちませんでした。代わりに resizeSections() を使用することを検討してください。これは 1 回限りの調整と思われます。

于 2019-02-26T18:43:53.487 に答える
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 に答える