Сортируемый QHBoxLayout - PullRequest
       5

Сортируемый QHBoxLayout

0 голосов
/ 12 января 2011

Я использую Qt для создания сортируемого гистограммоподобного виджета.Виджет размечен с QHBoxLayout для каждой панели на графике (которые также являются виджетами).

Когда пользователь изменяет параметры сортировки, мой контроллер очищает макет, сортирует его и вызывает addWidget для каждого элементас целью.Проблема, с которой я сталкиваюсь, заключается в том, что этот список довольно большой (1000+ виджетов), и Qt сканирует, пытаясь расположить так много элементов.

Я обнаружил, что каждый раз, когда вызывается addWidget, Qtпересчитает местоположение каждого элемента в QHBoxLayout и затем обновит.Это проблема, так как он выполняет много ненужных вычислений для каждого LayoutItem перед тем, который я добавляю.Для 1000 тестовых заданий, которые я вставляю, переработка занимает около 30 секунд, что, очевидно, слишком долго.

Есть ли лучший тип макета для использования или более быстрый способ добавить коллекциюотсортировали виджеты по макету?

Редактировать: Очевидно, у меня возникла проблема не с тем, чтобы Qt снова выкладывал каждый элемент, а с внутренними элементами всех родительских и махинаций, которые происходят за кулисами.создайте тестовый проект, чтобы добавить 1000 кнопок в макет, каждый раз распечатывая счетчик.Числа распечатывались почти мгновенно, хотя Qt потребовалось те же самые ~ 30 секунд, чтобы выпрямиться.Я думаю, что проблема существует не только с QHBoxLayout, но и с системой компоновки Qt в целом.Похоже, я буду вручную размещать виджеты и вообще обходить QLayout.Спасибо всем, кто внес свой вклад.

Ответы [ 3 ]

2 голосов
/ 13 января 2011

С документация из void QLayout::setEnabled(bool enable)

Включает этот макет, если enable - true, иначе отключает его. Включенный макет динамически подстраивается под изменения; отключенный макет действует так, как будто не существует.
По умолчанию все макеты включены.

0 голосов
/ 13 января 2011

Возможно, вы можете создать новый QHBoxLayout без родителя, добавить свои виджеты в этот макет, а затем удалить старый QHBoxLayout и вставить свой новый макет. ВНИМАНИЕ: я не пробовал это.

0 голосов
/ 12 января 2011

Как насчет создания графического виджета (состоящего из виджетов Bar (или любого другого названия), который будет содержать ваш собственный подкласс QLayout , оптимизированный для этой задачи (поскольку вам нужно переопределить QLayout: : addItem () , который является чисто виртуальным в QLayout).

Кроме того, обязательно посмотрите Qwt , так как он уже мог реализовать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...