QTableView работает очень медленно (даже для 3000 строк) - PullRequest
11 голосов
/ 27 октября 2010

У меня есть таблица с 3000 строк и 8 столбцов.Я использую QTableView.Чтобы вставить элементы, я делаю:

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

, где mModel - QStandardItemModel.Все хорошо, если у меня не много строк, но когда я пытаюсь визуализировать большие данные (около 3000 строк), то это очень медленно (20 секунд на 64-битной Win 7 (8-ядерный компьютер с 8 ГБ ОЗУ!)!!)).Что я могу сделать, чтобы улучшить производительность?

Заранее спасибо.

Ответы [ 8 ]

8 голосов
/ 07 апреля 2011

Хороший вызов для автоматического изменения содержимого ваших столбцов или строк.

У меня есть функция, которая добавляет столбец в таблицу каждый раз, когда клиент подключается к моему серверному приложению.Поскольку количество столбцов в таблице стало большим, время вставки, похоже, занимало все больше и больше времени.

Я делал ui-> messageLog-> resizeRowsToContents ();каждый раз.Я изменил это, чтобы автоматически изменять размер добавляемой строки ui-> messageLog-> resizeRowToContents (0); и медлительность исчезла.

3 голосов
/ 27 октября 2010

Я нашел решение: проблема была в том, что я присвоил модель табличному виду уже в конструкторе. Поэтому каждый раз, когда я вставляю предмет в модель, tableview был проинформирован и, вероятно, обновлен. Теперь я назначаю модель просмотр таблицы только после того, как я заполнил свою модель данными. Это не элегантное решение, но оно работает. Есть ли способ временно отключить модель из таблицы или что-то, что говорит к таблице в не заботиться об изменениях в модели?

2 голосов
/ 29 октября 2010

Кроме того, если все ваши строки имеют одинаковую высоту, установка http://doc.qt.io/qt-5/qtreeview.html#uniformRowHeights-prop в значение true может повысить производительность. В моем случае модель, содержащую около 50 000 строк, была почти непригодна для использования, если дляiformRowHeights установлено значение false (по умолчанию). После того, как оно изменилось на true, оно заработало как шарм.

2 голосов
/ 27 октября 2010

Для этого количества данных вам будет лучше с пользовательской моделью - тогда вы будете иметь контроль, например, когда будете сообщать о представлении обновлений.«Стандартные» элементы масштабируются до сотен, а возможно и тысяч, из-за высокой скорости работы современного оборудования, но они явно задокументированы как не предназначенные для наборов данных такого размера.

2 голосов
/ 27 октября 2010

Есть ли у вас авторазмер содержимого ваших столбцов или строк? Иногда это может быть убийственным в производительности!

Посмотрите здесь: QHeaderView :: ResizeToContents

Надеюсь, это поможет!

1 голос
/ 10 августа 2016

попробуйте это:

             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 голосов
/ 26 февраля 2019

Остерегайтесь setSectionResizeMode ().Это имело огромное значение для производительности.Это вызывает пересчет размера строк и столбцов при каждой модификации (т. Е. При каждом вызове setData () / setText ()).Это не было заметно, пока я не достиг 1000+ строк.Попробуйте вместо этого использовать функцию resizeSections (), которая представляется одноразовой корректировкой.

0 голосов
/ 28 декабря 2013

Я использую 80000 строк, и у меня была похожая проблема с добавлением огромного количества элементов в таблицу.

Мое решение состояло в том, чтобы позволить ему заранее выделить память, указав, сколько строк ей потребуется.

Я использовал Qtableview и модель, поэтому:

self.model.setRowCount (80000)

Я уверен, что вы можете сопоставить это с вашим кодом

...