QTableWidget - Тормоза при формировании заголовка
От: Demon051  
Дата: 06.12.17 06:59
Оценка:
Всем привет.
Помогите пожалуйста, найти вариант решения проблемы.

Формирую заголовок QTableWidget


 _ui.calcDataView->setColumnCount(daysCnt*2 + 1);

    QTableWidgetItem * item = new QTableWidgetItem("ID");
    _ui.calcDataView->setHorizontalHeaderItem(0,item);
    _ui.calcDataView->hideColumn(0);
   QDate dt = _reportParameters->from().date();

    for(int i=1; i<=daysCnt*2; i++)
    {       
       QString str = QString::fromUtf8("Приход %1").arg(dt.toString("dd.MM"));

       QTableWidgetItem * item = new QTableWidgetItem(str);
       _ui.calcDataView->setHorizontalHeaderItem(i,item);
       QApplication::processEvents();

       i++;
       str = QString::fromUtf8("Уход %1").arg(dt.toString("dd.MM"));
       item = new QTableWidgetItem(str);
       _ui.calcDataView->setHorizontalHeaderItem(i,item);

       dt = dt.addDays(1);
     }


При большом кол-ве столбцов (например более 300), на формирование заголовка уходит больше минуты.
Время отжирает операция вставки _ui.calcDataView->setHorizontalHeaderItem(i,item) ;
Ещё есть варианты — более быстрые?
через _ui.calcDataView->setHorizontalHeaderLabels(headers) ; пробовал — ещё тормознее!!!
qtablewidget qtablewidgetitem
Re: QTableWidget - Тормоза при формировании заголовка
От: Qt-Coder  
Дата: 06.12.17 07:35
Оценка: 1 (1) +1
Здравствуйте, Demon051, Вы писали:

Надо отказаться от QTableWidget и перейти на QTableView.
Re[2]: QTableWidget - Тормоза при формировании заголовка
От: Demon051  
Дата: 06.12.17 07:50
Оценка:
Здравствуйте, Qt-Coder, Вы писали:

QC>Здравствуйте, Demon051, Вы писали:


QC>Надо отказаться от QTableWidget и перейти на QTableView.


К сожалению уже поздно...
Проект на стадии завершения и вот при проверке на больших объемах оно и всплыло.
На данный виджет завязана куча всего и теперь надо как-то выкрутиться.

Я правильно понимаю, что переход на QTableView приведет к необходимости создания всяких моделей и т.д.?
Или же там можно так же просто как с QTableWidget, но будет быстрее работать?
Re[3]: QTableWidget - Тормоза при формировании заголовка
От: Qt-Coder  
Дата: 06.12.17 08:02
Оценка: +1
Здравствуйте, Demon051, Вы писали:

D>Я правильно понимаю, что переход на QTableView приведет к необходимости создания всяких моделей и т.д.?

D>Или же там можно так же просто как с QTableWidget, но будет быстрее работать?

Да нужна модель. В ней описываются и заголовки и данные. QTableWidget это нашлепка над QTableView. Основные тормоза при работе с QTableWidgetItem.

Кстати, вставка в цикл QApplication::processEvents(); ни разу не ускоряет работу. Наоборот цикл обработки отвлекается на обработку сообщений, в том числе на отрисовку. Попробуйте убрать его для начала.
Re[4]: QTableWidget - Тормоза при формировании заголовка
От: SaZ  
Дата: 06.12.17 08:45
Оценка:
Здравствуйте, Qt-Coder, Вы писали:

QC>...

QC>Кстати, вставка в цикл QApplication::processEvents(); ни разу не ускоряет работу. Наоборот цикл обработки отвлекается на обработку сообщений, в том числе на отрисовку. Попробуйте убрать его для начала.

Как вариант, если нет времени на нормальное решение — можно дёргать его, например, один раз на каждые 30-100 итераций цикла. Шаг подобрать эмпирически.

По поводу моделей и быстродействия — на самом деле никто не запрещает формировать саму модель в отдельном потоке, а потом за 1 операцию подменять модель уже в GUI потоке. QStandardItem не является наследником QObject/QWidget. Многие почему-то про это забывают.
Re[5]: QTableWidget - Тормоза при формировании заголовка
От: Demon051  
Дата: 06.12.17 11:30
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, Qt-Coder, Вы писали:


QC>>...

QC>>Кстати, вставка в цикл QApplication::processEvents(); ни разу не ускоряет работу. Наоборот цикл обработки отвлекается на обработку сообщений, в том числе на отрисовку. Попробуйте убрать его для начала.

SaZ>Как вариант, если нет времени на нормальное решение — можно дёргать его, например, один раз на каждые 30-100 итераций цикла. Шаг подобрать эмпирически.


SaZ>По поводу моделей и быстродействия — на самом деле никто не запрещает формировать саму модель в отдельном потоке, а потом за 1 операцию подменять модель уже в GUI потоке. QStandardItem не является наследником QObject/QWidget. Многие почему-то про это забывают.



нашлись вот такие "костыли" на эту тему

_ui.calcDataView->model()->blockSignals( true );
_ui.calcDataView->blockSignals( true );

.......

_ui.calcDataView->model()->blockSignals( false );
_ui.calcDataView->blockSignals( false );


к наполнению заголовка таблицы применяются на ура — летает как ракета
Re[6]: QTableWidget - Тормоза при формировании заголовка
От: SaZ  
Дата: 06.12.17 11:41
Оценка: 2 (1)
Здравствуйте, Demon051, Вы писали:

D>нашлись вот такие "костыли" на эту тему

D>
D>_ui.calcDataView->model()->blockSignals( true );
D>_ui.calcDataView->blockSignals( true );
D>.......
D>_ui.calcDataView->model()->blockSignals( false );
D>_ui.calcDataView->blockSignals( false );
D>

D>к наполнению заголовка таблицы применяются на ура — летает как ракета

Так себе. Я бы посоветовал в конце этого всего сделать emit _ui.calcDataView->model()->dataChanged( QModelIndex(), QModelIndex() ); чтобы обновить содержимое. А то на некоторых визуальных темах может не обноваться контент.

З.Ы. с blockSignals будьте готовы к случайным падениям, если юзер тыкнет мышкой во вьюху в процессе апдейта. Уменьшить риски, но не убрать их на 100% можно задизэйблив виджет на время обновления. И так же запретить изменение размера окна, на котором лежит вьюха. В общем, мы такие костыли явно запрещали у себя.

З.З.Ы. processEvents лучше вообще выкинуть из цикла.
Отредактировано 06.12.2017 12:57 SaZ . Предыдущая версия . Еще …
Отредактировано 06.12.2017 11:44 SaZ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.