Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableWidget - Тормоза при формировании заголовка  (Прочитано 14408 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
demon051
Помогающий

ru
Offline Offline

« : 06-12-2017 07:07 » 

Всем привет.
Помогите пожалуйста, найти вариант решения проблемы.

Пишу программу под Qt

Надо сформировать отчет. Использую 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) ; пробовал - ещё тормознее!!!
Записан
darkelf
Молодой специалист

de
Offline Offline

« Ответ #1 : 06-12-2017 08:41 » 

demon051, как вариант - попробуйте на время вставки отключать визуальное отображение при помощи setUpdatesEnabled()
Записан
demon051
Помогающий

ru
Offline Offline

« Ответ #2 : 06-12-2017 08:59 » 

demon051, как вариант - попробуйте на время вставки отключать визуальное отображение при помощи setUpdatesEnabled()
к сожалению не помогло Жаль
Записан
darkelf
Молодой специалист

de
Offline Offline

« Ответ #3 : 06-12-2017 09:06 » new

а Вы отключали во вне цикла, или внутри? Если внутри, то попробуйте снаружи - внутри оно, конечно, никакого эффекта не даст.
« Последнее редактирование: 06-12-2017 09:09 от darkelf » Записан
demon051
Помогающий

ru
Offline Offline

« Ответ #4 : 06-12-2017 09:39 » 

а Вы отключали во вне цикла, или внутри? Если внутри, то попробуйте снаружи - внутри оно, конечно, никакого эффекта не даст.

включал и выключал естественно снаружи
Записан
darkelf
Молодой специалист

de
Offline Offline

« Ответ #5 : 06-12-2017 09:56 » 

ещё попробуйте при отключенной перерисовке убрать:
Код: (C++)
QApplication::processEvents();
Тут советуют переходить на QTableView
« Последнее редактирование: 06-12-2017 10:00 от darkelf » Записан
demon051
Помогающий

ru
Offline Offline

« Ответ #6 : 06-12-2017 10:02 » 

ещё попробуйте при отключенной перерисовке убрать:
Код: (C++)
QApplication::processEvents();
Тут советуют переходить на QTableView

не помогло Жаль
Записан
darkelf
Молодой специалист

de
Offline Offline

« Ответ #7 : 06-12-2017 10:08 » 

Ещё есть тут варианты. В частности топикстартеру, по его словам, помогла блокировка сигналов.
« Последнее редактирование: 06-12-2017 10:11 от darkelf » Записан
demon051
Помогающий

ru
Offline Offline

« Ответ #8 : 06-12-2017 11:24 » 

Ещё есть тут варианты. В частности топикстартеру, по его словам, помогла блокировка сигналов.


интересные костыли...
пробую. кое-что получается. ну по крайней мере столбцы быстро добавляются.
спасибо!
Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 06-12-2017 16:00 » 

Код:
...
       QTableWidgetItem * item = new QTableWidgetItem(str);
       _ui.calcDataView->setHorizontalHeaderItem(i,item);
...
А может быть такая штука, что setHorizontalHeaderItem(i,item) не привязывает  QTableWidgetItem, а копирует его?

Может быть попробовать статически задать:
Код: (C++)
...
       QTableWidgetItem item(str); /* Синтаксис не помню! */
       _ui.calcDataView->setHorizontalHeaderItem(i, &item);
...
Если все столбцы окажутся одинаковыми - значит привязывает, а если разные - значит копирует. Или ерунду пишу?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 07-12-2017 04:49 » 

Aether, нет, не копирует, это специфика Qt )

demon051,  я на другом форуме тоже предложил модель, но отключение сигналов наверняка тоже может помочь.

Тем не менее, настаиваю на модели, это удобнее Улыбаюсь
Записан

demon051
Помогающий

ru
Offline Offline

« Ответ #11 : 07-12-2017 06:48 » 

Aether, нет, не копирует, это специфика Qt )

demon051,  я на другом форуме тоже предложил модель, но отключение сигналов наверняка тоже может помочь.

Тем не менее, настаиваю на модели, это удобнее Улыбаюсь

время жмет, не до моделей. тем более в теме Qt на такой глубине я впервые. Ещё и модели изучать. Улыбаюсь начальство не одобрит срыва сроков. Потом, если будет время и необходимость, мож переделаю. Пока блокировка очевидно помогла. Приделал ее и к наполнению таблиц содержимым. Всё работает быстренько.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 07-12-2017 07:46 » 

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

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines