Russian Qt Forum
Апрель 20, 2024, 03:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QTableView + resizeRowsToContents = очень мендленно  (Прочитано 5581 раз)
titan83
Гость
« : Январь 27, 2017, 21:39 »

Коллеги, здравствуйте.
Появилась у меня легкая проблема.
Есть QTableView, в который я загружаю обычно немного данных (<100 строк на 3 столбца), к нему же подключен делегат, обсчитывающий высоту строки в зависимости от данных из модели.
Но тут я загрузил ~50000 строк и получил ~55 секунд на обработку (15 секунд sql, остальное - пересчет размеров строк).
Печаль меня ждала в виде метода QTableView::resizeRowsToContents(), который честно вызывал методы моего делегата 50000 раз, при том что одновременно показывается не больше 30 строк.
Я хотел использовать его младшего брата QTableView::resizeRowToContents(int row), это, вроде, то, что нужно. Но загвоздка в том, что я не могу найти способа отлавливать ни момент изменения отображаемых строк, ни получить индексы строк, которые показывает QTableView в данный момент.
Может я вообще пошел не тем путем, но тут важна итоговая цель - не тратить время на пересчет не отображаемых в данный момент строк.
Спасибо.
« Последнее редактирование: Январь 28, 2017, 10:37 от titan83 » Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Январь 27, 2017, 21:59 »

попробуйте:
void QHeaderView::setResizeContentsPrecision(int precision)
...
Special value 0 means that it will look at only the visible area. Special value -1 will imply looking at all elements.
...
Записан
titan83
Гость
« Ответ #2 : Январь 27, 2017, 22:26 »

попробуйте:
void QHeaderView::setResizeContentsPrecision(int precision)
...
Special value 0 means that it will look at only the visible area. Special value -1 will imply looking at all elements.
...
спасибо.
пробовал сделать на verticalHeader(), перед этим добавив setResizeMode(QheaderView::ResizeToContents), но что-то у меня так и не взлетело - бесконечный пересчет начался.
Записан
titan83
Гость
« Ответ #3 : Январь 28, 2017, 10:37 »

Пошел я по пути наименьшего сопротивления и сделал фиксированную высоту строк, стало очень быстро, заказчик согласовал.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #4 : Февраль 01, 2017, 15:42 »

Печаль меня ждала в виде метода QTableView::resizeRowsToContents(), который честно вызывал методы моего делегата 50000 раз, при том что одновременно показывается не больше 30 строк.
Это потому, что ему надо просчитать значения скроллбара вертикального.
То, что вы сделали фиксированную ширину - единственный правильный способ добиться скорости, да.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.