Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 2
1

QTreeWidget и QTableWidget во вкладке (QTabWidget). Медленное заполнение, если открыта другая вкладка

23.05.2020, 12:36. Просмотров 214. Ответов 4

Привет.
Как обозначено в заголовке, есть две вкладки, одна открыта по умолчанию и в ней ничего не делается (в ней размещён один виджет "QTreeWidget", пустой), во второй также есть "QTreeWidget" и "QTableWidget", которые заполняются при чтении файла.

Счёт идёт примерно на десятки тысяч пунктов в дереве, если считать пункты и верхнего уровня, и дочерние. В таблице - на тысячи. Если перед открытием файла оставляю открытой первую вкладку (пустую), то заполнение идёт около 20 секунд. Если открываю предварительно вторую вкладку (нужная), то менее 1 секунды.

QElapsedTimer-ом промерил, картина такая - в дереве в первом случае медленнее отрабатывают методы "addChild()" и "addTopLevelItem()". Чем дальше от начала выполнения, тем дольше.
Для таблицы вызывается "setVerticalHeaderItem()", и его выполнение, если открыта «пустая» вкладка, тоже растёт, и не растёт если открыта нужная.

Удивлён тем, что медленнее работает именно когда открыта другая вкладка, а не та которая содержит нужный виджет. Кто-нибудь подскажет, почему так?
Что не помогло:
- setUpdatesEnabled(false) для виджета дерева
- setVisible(false) для виджета дерева
- blockSignals() для виджета дерева
- setUpdatesEnabled(false) для виджета вкладок
- setUpdatesEnabled(false) для всего окна
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2020, 12:36
Ответы с готовыми решениями:

Как запретить работу в одной форме если открыта другая?
Подскажите, пожалуйста, как запретить работу в одной форме если открыта другая?

Экспорт содержимого из qtreewidget в qtablewidget
Всем привет! Хочу в программе перенести все содержимое из qtreewidget в qtablewidget. Как это...

Как определить, что открыта панель Персонализации и завершить её, если она открыта?
Я понимаю, что необходимо узнать Hendle окна. Но как узнать хэндл Панель управления\Все элементы...

Из какой формы открыта другая форма?
Имеется несколько форм в программе. Открыли Form2 из Form1. Как в Form2 узнать, что она открыта...

4
Эксперт C
23450 / 14691 / 3095
Регистрация: 24.12.2010
Сообщений: 31,331
24.05.2020, 11:55 2
rebus_x, конкретно по твоему вопросу ничего сказать не могу. Самому интересно это парадоксальное поведение. Был бы рад услышать объяснение от более знающих.
Но из общих соображений, конечно, при таких объемах надо переходить с XxxWidget на XxxView. Думаю, ты сам к этому придешь.
0
433 / 271 / 98
Регистрация: 08.11.2016
Сообщений: 773
25.05.2020, 02:22 3
Такого быть не должно. Прототип MainWindow class, реализацию его конструктора и метода заполнения виджетов - будем препарировать.
0
89 / 16 / 6
Регистрация: 21.09.2016
Сообщений: 174
25.05.2020, 02:27 4
Полностью согласен с Байт. Все что содержит более 500 элементов лучше делать на базе view - из соображений производительности.
0
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 2
27.05.2020, 16:59  [ТС] 5
Цитата Сообщение от rebus_x Посмотреть сообщение
- blockSignals() для виджета дерева
Этого как оказалось было мало, применил и для виджета, и для модели:
C++ (Qt)
1
2
treewidget->blockSignals(true);
treewidget->model->blockSignals(true);
Откопал рецепт здесь.
Всем спасибо.

И если интересно, то в моём случае я очень сильно подозреваю, что это замедление связано с состоянием свойства "visible" у виджета. Если перед загрузкой открыть вкладку, которая содержит дерево и таблицу, но предварительно спрятать их (hide()) - точно такое же замедление.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2020, 16:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Можно ли проверить, какая вкладка открыта?
как то на jquery можно проверить какая вкладка открыта и в случае обновления страницы оставить ее...

Запуск определённой функции, когда другая программ открыта на весь экран
github.com/masajinobe/WallEngine Нужно сделать так чтобы программа на tkinter проверяла все окна...

Определить, какая вкладка TabPage открыта в данный момент
Каким образом можно отслеживать, какая вкладка tabpage открыта в данный момент, чтобы при разных...

Programmable Tables: Как Узнать Какая Вкладка Таблицы Открыта У Пользо
Вкраце задача: На форме документа есть таблица с вкладками, вкладки настроены на переключение как...

Mozilla FireFox 47.0.2 - вкладка которая открыта, при переходе на неё, начинает загружаться заново
На скрине, та вкладка на которой я был, потом перешёл на другую, а потом вернулся на прежнюю, а там...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.