Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: antipart от Январь 04, 2012, 21:10



Название: Размещение множества сложных виджетов
Отправлено: antipart от Январь 04, 2012, 21:10
Доброго времени суток! 
Столкнулся с такой проблемой:
Есть большое количество(~1000) сложных кастомных виджетов(график дежурств)
- каждый включает в себя ~10 QLineEdit c QComplete + ~300 виджетов(по количеству дней в месяце для каждогоQLineEdit ) включающих в себя QCheckBox + 2QLabel + контекстное меню + всякие завязки SIGNAL/SLOT.
Вобщем проблема в том, что надо отображать не по одному, а все вместе, с прокруткой!

Пробовал:
1. QScrollArea - тормозит жутко, такое ощущение, что каждый раз (при переходе на вкладку с графиками) все перерисовывает.

2. QGraficsScene - отрисовывает нормально без тормозов, но здесь жесть при добавлении методом QGraficsScene::addWidget() (30 виджетов добавляются ~1min причем с постоянным замедлением) здесь скорость добавления очень зависит от сложности виджета.

3. QItemDelegate - через view->openPersistentEditor... тоже тормоза еще те (пробовал на 30 виджетах) при переходе на вкладку.

Подскажите реально ли это вообще сделать, может кто сталкивался? Куда копать?


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 13:10
По описанию сложно все это представить.
Может своя модель, QTableView и собственный делегат будет лучше?

На форуме была подобная тема и кто-то писал, что добивался приемлемой производительности с большим количеством виджетов, но по-моему это изврат и надо что-то менять.

1000 виджетов - это плохое проектирование.


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 13:23
Возможно, раз там что-то сложное рисуется нужно использовать кеширование, а не вычислять все каждый раз?


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 13:40
но по-моему это изврат и надо что-то менять.
1000 виджетов - это плохое проектирование.
1. понятно что изврат, и это не мое проектирование, задача так стоит и не иначе... уже голову сломал
2. мне бы хоть 300 виджетов запустить таким образом

вот думаю.. может не использовать QScrollArea, а отнаследоваться от QAbstractScrollArea -> можно ли в этом случае
поменять тип отрисовки, чтобы при переходе на эту вкладку апдейтилась только видимая часть как в QGraphics?
Ведь реально видны только 1-2 виджета на экране, остальные по скроллу..

как бы совместить поведение QScrollArea и QGraphicsScene, чтобы виджеты добавлялись быстро и при отображении не тормозили.

еще думал в сторону QItemDelegate:  в методе paint рисованием пытаться сдублировать весь этот большой гарфик дежурств
а потом на createEditor активировать сам виджет, но это геморрой еще тот... (тут же еще надо чтобы они совпадали)


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 13:48
Задача стоит получить 1000 виджетов или получить некоторый внешний вид?

Думаю в QScrollArea все нормально сделано, только видимая и отрисовывается. Проблема очевидно в другом.

Думай еще в сторону делегата. И еще. И еще. И модели соответственно.

Выложи картинку того, что ты хочешь получить.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 14:04
Да задача стоит получить много активных виджетов (обычный большой график дежурств на 9-10 человек) с возможностью ставить
снимать дежурства менять людей из выпадающего списка, менять количество часов и тарифную ставку для каждого дежурства и
в зависимости от дня недели + различная доп. информация в виде пристыкованных таблиц и шапок слева и сверху.
+ кнопки "Применить", "Сгенерить", "Очистить"...
Т.е. виджет сам по себе очень громоздкий (тянет на полноценное диалоговое окно), а тут надо еще и все сразу на одной вкладке
QTabWidget, типа как в Exel


Название: Re: Размещение множества сложных виджетов
Отправлено: BRE от Январь 05, 2012, 14:04
1. понятно что изврат, и это не мое проектирование, задача так стоит и не иначе... уже голову сломал
Видать, те люди, которые должны будут работать с этой программой, очень сильно насолили этому проектировщику... Могут все таки у нас юзабилите продумать качественно... :)

Честно говоря лично таких экспериментов не проводил, но QScrollArea со своими наследниками + делегаты должны нормально справляться с отрисовкой всего этого. Все таки большие таблицы и списки отрисовываю нормально.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 14:15
Видать, те люди, которые должны будут работать с этой программой, очень сильно насолили этому проектировщику... Могут все таки у нас юзабилите продумать качественно... :)

да нет.. все проще проектировщик и пользователь - одно лицо  ;)
долго ему пытались объяснить  что это через одно место... 
Я так хочу и все...  у него все эти графики в Экселе живут, теперь он решил это все оживить программно, но чтобы
непременно было как в Эксель - типа привык...

вот вырезал один


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 14:20
Я почему-то вижу тут один виджет QTableView и никак не вижу 1000 виджетов! А вы?


Название: Re: Размещение множества сложных виджетов
Отправлено: mutineer от Январь 05, 2012, 14:22
Так а зачем обязательно
Цитировать
~300 виджетов(по количеству дней в месяце для каждогоQLineEdit )
? Почему надо сразу 300 активных виджетов, а не подставлять виджет в ячейку, на которую кликнули, а без клика просто текст показывать? Эксель же не держит на форме своей 500к лайнэдитов, а подставляет один в нужную ячейку;)


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 14:25
Я почему-то вижу тут один виджет QTableView и никак не вижу 1000 виджетов! А вы?
так я один и вырезал и  документа , таких таблиц на одной вкладке и должно быть много


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 14:27
Я почему-то вижу тут один виджет QTableView и никак не вижу 1000 виджетов! А вы?
так я один и вырезал и  документа , таких таблиц на одной вкладке и должно быть много
Вот это жесть!  :o
Каким образом интересно? Монитор 100 дюймов?

Я просил скрин не документа, а того как это должно выглядеть в интерфейсе.


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 14:33
А зачем кстати вкладки? Вкладки портят концепцию.
Их убрать и зах**ить 10000 виджетов на одну форму)


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 14:38
Цитировать
Вот это жесть!  Шокированный
Каким образом интересно? Монитор 100 дюймов?
да именно это слово  :)
вот здесь и надо их скроллить...

Цитировать
Я просил скрин не документа, а того как это должно выглядеть в интерфейсе.
так и должно выглядеть в интерфейсе....
только почти все элементы таблицы активные...
т.е. где ФИО там лайЕдиты с  Автокомплетами по всем дежурным в БД
там где собственно клеточки дежурств нужно назначать или снимать смены (через контекстное меню и QCheckBox)
менять часы и тарифы тоже для каждой клеточки дежурств и т.д.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 14:46
А зачем кстати вкладки? Вкладки портят концепцию.
Их убрать и зах**ить 10000 виджетов на одну форму)
На других вкладках другая информация не имеющая отношения к проблеме (например отчеты или редакция дежурных и т.д.)
Графики дежурств на одной вкладке, т. е. на одном виджете афигенного размера, который и надо скроллить
ну или как я уже писал есть варианты : на одной сцене , или в одной вьюхе  у которых скролл встроенный

Так вот только в случае со сценой (при переходе на вкладку с графиками) нет тормозов все четко и быстро скроллится
а в других вариантах надо подождать несколько минут(30видж. ~2min) после клика на вкладке и собственно отображением содержимого вкладки


Название: Re: Размещение множества сложных виджетов
Отправлено: BRE от Январь 05, 2012, 14:50
а в других вариантах надо подождать несколько минут(30видж. ~2min) после клика на вкладке и собственно отображением содержимого вкладки
Ох, что-то ты не то делаешь. Нарисовать 30 виджетов это так... пустяк. Какие могут быть 2 минуты?  :o
Покажи как ты все делаешь для QScrollArea.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 15:05
Цитировать
Ох, что-то ты не то делаешь. Нарисовать 30 виджетов это так... пустяк. Какие могут быть 2 минуты?
эт точно, когда только 30..
а когда каждый еще включает в себя еще ~500 и более виджетов тут интереснее :o

как делаю в случае со QScrollArea...
мне проще это на словах описать, т.к. генерится это в разных местах + с анализом QDate + БД и т.д. но смысл такой...

создаю QWidget в нем QGridLayout  в лэйауте размещаю 9 полосок из QLineEdit + кастомный виджет, который представляет собой тоже полоску из маленьких клеточек-виджетов(дежурств) 30-31шт (по количеству дней в месяце) каждая клеточка-виджет включает в себя QCheckBox + 2QLabel+контекстное меню для управления клеточкой(вызов доп. диалогов и т.д.)

далее пихаю в QScrollArea
Код:
    QScrollArea *area = new QScrollArea();
    area->setFrameStyle(QFrame::NoFrame);
    area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    area->setWidget(table);


Название: Re: Размещение множества сложных виджетов
Отправлено: mutineer от Январь 05, 2012, 15:07
Возможно прога спотыкается не на попытке нарисовать, а на попытке разместить все это замечательное хозяйство, то бишь при работе лейаутов все тормозит


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 15:10
забыл еще раз сказать, что QScrollArea пихаю виджет с 30-ю такими таблицами


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 15:14
Возможно прога спотыкается не на попытке нарисовать, а на попытке разместить все это замечательное хозяйство, то бишь при работе лейаутов все тормозит
создаю пока все это в конструкторе, а не постоянно... ибо так проще прикрыть каким-нибудь splash при запуске приложения
при выводе через qDebug()<<table->id;
вижу что достаточно медленно, но не очень критично...
а дальше проблемы именно с отрисовкой т.к. при попытке перейти на вкладку уже все создано... :(


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 15:16
Я никак не пойму, чем тебя не устраивает модель+делегат+вьюха?


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 15:22
Меня всегда убивали такие монструозные экселевские таблицы.
Сначала один человек сидит и выносит себе мозг. Потом выносит еще кому-то мозг.

Потом он решает это напечатать, снова выносит себе мозг.
Потом, распечатав, он несет это несчастному кому-то и выносит мозг уже ему.

А потом приходит новый сотрудник, и старый заставляет его делать так же.
А потом спустя ..дцать лет, новый сотрудник уже во всю клепает такие же и выносит мозг новичкам.

А потом все они не хотят по-другому, потому что они "привыкли так".

Как это остановить? )


Название: Re: Размещение множества сложных виджетов
Отправлено: BRE от Январь 05, 2012, 15:32
Возможно прога спотыкается не на попытке нарисовать, а на попытке разместить все это замечательное хозяйство, то бишь при работе лейаутов все тормозит
Кстати, здравая мысль, возможно тормоза начинаются на этапе расчета геометрии. Хорошо бы это проверить...
Правда пока не представляю как можно сделать этот расчет единожды и применить для всех одинаковых виджетов. Возможно придется писать свой компоновщик для этого.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 15:35
Я никак не пойму, чем тебя не устраивает модель+делегат+вьюха?
я уже писал на эту тему ....
исходя из того, что мне нужны активные виджеты...
есть (на мой взгяд) два варианта с делегатом
1. это использовать для всех
 
Код:
for (int i = 0; i < objModel->rowCount(QModelIndex()); ++i)
            view->openPersistentEditor(objModel->index(i, 0, QModelIndex()));
2.
Цитировать
еще думал в сторону QItemDelegate:  в методе paint рисованием пытаться сдублировать весь этот большой гарфик дежурств
а потом на createEditor активировать сам виджет, но это геморрой еще тот... (тут же еще надо чтобы они совпадали)

вариант 1 пробовал т.к. реализовать проще , та же хрень как и со QScrollArea... нет вру чуть лучше, но тоже тормозит
при отрисовке

вариант 2 не пробовал - боюсь даже приступать ради того чтобы попробовать... уж слишком... поэтому и спросил может
кто нечто делал или может есть еще варианты  :(


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 15:37
Цитировать
Кстати, здравая мысль, возможно тормоза начинаются на этапе расчета геометрии. Хорошо бы это проверить...
Правда пока не представляю как можно сделать этот расчет единожды и применить для всех одинаковых виджетов. Возможно придется писать свой компоновщик для этого.
уже интереснее... :) скорее всего так и есть ... потому что повторный клик на вкладке работает заметно быстрее...


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 15:53

вариант 1 пробовал т.к. реализовать проще , та же хрень как и со QScrollArea... нет вру чуть лучше, но тоже тормозит
при отрисовке
Очень странно. Чему там тормозить? Обычные текстовые строчки.

Поищи похожую тему на форуме. Там было какое-то решение вроде бы для этого.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 16:03
Цитировать
Очень странно. Чему там тормозить? Обычные текстовые строчки.
имеется в виду что график показывать только например при клике(view->openPersistentEditor), а так просто строчки?
я правильно понял?
если да.. можно конечно попытаться склонить к этому решению... задача стоит ведь чтобы все сразу таблицы были видны  и активны
а потом если наоткрывать этих едиторов опять будут тормоза...
 у меня была мысль как-то на скролле открывать и закрывать едиторы... пока ее не развивал


Название: Re: Размещение множества сложных виджетов
Отправлено: mutineer от Январь 05, 2012, 16:06
задача стоит ведь чтобы все сразу таблицы были видны  и активны

Редактировать все равно можно только один виджет одновременно :)


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 16:08
Цитировать
Редактировать все равно можно только один виджет одновременно
да это понятно... но надо чтобы другие были хотя-бы видны (а не просто строчки)


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 16:12
Цитировать
Очень странно. Чему там тормозить? Обычные текстовые строчки.
имеется в виду что график показывать только например при клике(view->openPersistentEditor), а так просто строчки?
я правильно понял?
если да.. можно конечно попытаться склонить к этому решению... задача стоит ведь чтобы все сразу таблицы были видны  и активны
а потом если наоткрывать этих едиторов опять будут тормоза...
 у меня была мысль как-то на скролле открывать и закрывать едиторы... пока ее не развивал

Нет, я о другом говорил.
Твоя таблица (во вложении). Что в ней сложного? Все данные текстовые, ничего рисовать не нужно.
Делегат прекрасно справится с отображением и редактированием твоих данных.
И делай хоть 100 таких таблиц. Зачем все делать виджетами ума не приложу.


Название: Re: Размещение множества сложных виджетов
Отправлено: mutineer от Январь 05, 2012, 16:19
2 andrew.k
Видать его юзер хочет, чтобы все это выглядело как виджеты %)


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 16:23
2 andrew.k
Видать его юзер хочет, чтобы все это выглядело как виджеты %)
Он же сам говорил, что выглядеть должно так же как на скриншоте.
А где там "как виджеты"?


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 16:28
Цитировать
Нет, я о другом говорил.
Твоя таблица (во вложении). Что в ней сложного? Все данные текстовые, ничего рисовать не нужно.
Делегат прекрасно справится с отображением и редактированием твоих данных.
И делай хоть 100 таких таблиц. Зачем все делать виджетами ума не приложу.

так это Exel и делает ... а как быть с событиями...
там ведь к каждой ячейке привязан свой скрытый класс с данными о дате, часах, тарифах, о дежурных, об объекте и т.п.
+ всякие нарушения , опоздания...
и потом контекстное меню меняется в зависимости от этих данных и вызывает различные доп. диалоги и др.
да и редакция в основном через контекстное меню за исключением может QCheckBox (ну его можно тоже в меню скрыть)


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 16:35
Цитировать
Нет, я о другом говорил.
Твоя таблица (во вложении). Что в ней сложного? Все данные текстовые, ничего рисовать не нужно.
Делегат прекрасно справится с отображением и редактированием твоих данных.
И делай хоть 100 таких таблиц. Зачем все делать виджетами ума не приложу.

так это Exel и делает ... а как быть с событиями...
там ведь к каждой ячейке привязан свой скрытый класс с данными о дате, часах, тарифах, о дежурных, об объекте и т.п.
+ всякие нарушения , опоздания...
и потом контекстное меню меняется в зависимости от этих данных и вызывает различные доп. диалоги и др.
да и редакция в основном через контекстное меню за исключением может QCheckBox (ну его можно тоже в меню скрыть)
Модель тебе со всем этим поможет.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 16:35
Цитировать
И делай хоть 100 таких таблиц.
как сделать 100 таких таблиц в одной вьюхе? с объединенными строками и столбцами и разными делегатами?
да еще и ссылки на структуры данных прикрутить?


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 16:38
Цитировать
Модель тебе со всем этим поможет.
я очень давно пользуюсь разными моделями, но не было необходимости делать такие сложные таблицы...
поэтому не знаю как это можно реализовать в Model/View


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 16:39
Цитировать
И делай хоть 100 таких таблиц.
как сделать 100 таких таблиц в одной вьюхе? с объединенными строками и столбцами и разными делегатами?
да еще и ссылки на структуры данных прикрутить?
Мне сложно тут давать совет, потому что я бы ни за что на свете не стал бы делать такой интерфейсный кошмар.
Может оно и будет хорошо и удобно, но то как я сейчас себе это представляю по описанию меня пугает.

1. 100 вьюх и сто моделей.
2. Делать хитрую модель, которая будет в одной вьюхе показывать все это безобразие (но даже не знаю, стоит ли? не думаю)


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 16:44
Цитировать
Модель тебе со всем этим поможет.
я очень давно пользуюсь разными моделями, но не было необходимости делать такие сложные таблицы...
поэтому не знаю как это можно реализовать в Model/View
Очень странное сообщение.

The QAbstractTableModel class provides an abstract model that can be subclassed to create table models.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 19:08
Цитировать
Модель тебе со всем этим поможет.
я очень давно пользуюсь разными моделями, но не было необходимости делать такие сложные таблицы...
поэтому не знаю как это можно реализовать в Model/View
Очень странное сообщение.

The QAbstractTableModel class provides an abstract model that can be subclassed to create table models.
я имел в виду , что не знаю как делать в Model/View таблицы подобного рода (с объединенными строками и столбцами
+ index.internalPointer() создавать на каждую ячеку свой т.к. мне нужна ссылка на структурный класс который отвечает за хранение
данных и работает с БД + после изменения например дежурного в лайнЕдите нужно загружать все его дежурства если они есть
и снова переиндексировать модель) но это ладно можно вообразить ... но 100 подобных таблиц в одной вьюхе мне представить сложно кроме как если 1 таблица соответствует одной строке...


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 22:03
опытным путем установил, что дело не QScrollArea  и QLayout

пробовал размещать 30 таблиц просто на виджете без лэйаута с использованием move(); друг под другом
даже если делать фиксированную высоту виджета родителя так чтобы видна была только одна таблица
все равно тормозит так как-будто пытается отобразить все таблицы, а не только видимую часть виджета с одной таблицей

если же всем таблицам кроме первой указать hide(); то виджет ведет себя так будто в нем живет только одна таблица, т.е
шустро.

С чем это связано? может надо использовать какие-то флаги\атрибуты для виджета родителя или наоборот что-то отключить?



Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 05, 2012, 22:16
p.s.
можно даже взять ~3000-4000 обычных QPushButton и положить одна на другую без всяких move(); на одну из вкладок QTabWidget
 и попереключаться между вкладками. Будет понятно о чем речь.


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 23:19
p.s.
можно даже взять ~3000-4000 обычных QPushButton и положить одна на другую без всяких move(); на одну из вкладок QTabWidget
 и попереключаться между вкладками. Будет понятно о чем речь.
О чем это говорит? О том, что не нужно создавать 3000-4000 виджетов!

Есть кто считает, что это нормально?


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 23:25
Цитировать
Модель тебе со всем этим поможет.
я очень давно пользуюсь разными моделями, но не было необходимости делать такие сложные таблицы...
поэтому не знаю как это можно реализовать в Model/View
Очень странное сообщение.

The QAbstractTableModel class provides an abstract model that can be subclassed to create table models.
я имел в виду , что не знаю как делать в Model/View таблицы подобного рода (с объединенными строками и столбцами
+ index.internalPointer() создавать на каждую ячеку свой т.к. мне нужна ссылка на структурный класс который отвечает за хранение
данных и работает с БД + после изменения например дежурного в лайнЕдите нужно загружать все его дежурства если они есть
и снова переиндексировать модель) но это ладно можно вообразить ... но 100 подобных таблиц в одной вьюхе мне представить сложно кроме как если 1 таблица соответствует одной строке...

Мне кажется лучше разбираться с этим, чем плодить тыщи виджетов.
Интересный вопрос, что делать со span. Оказывается его можно задать только для view.
Было бы удобно из модели как-то управлять.


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 05, 2012, 23:31
Вот и ответ тебе.

QSize QAbstractItemModel::span ( const QModelIndex & index ) const


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 06, 2012, 17:06
Вот и ответ тебе.

QSize QAbstractItemModel::span ( const QModelIndex & index ) const
спасибо за совет, покопаем сюда... :'(


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 06, 2012, 17:12
смущает правда это:
Цитировать
Note: Currently, span is not used.


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 06, 2012, 17:17
смущает правда это:
Цитировать
Note: Currently, span is not used.
Не попробуешь - не узнаешь, кстати, если попробуешь, не забудь сюда рассказать, что получилось.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 06, 2012, 17:43
пока больше склоняюсь  к еще одной попытке склонить  :) товарища на более грамотное решение по юзабилити...


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 06, 2012, 23:24
пока больше склоняюсь  к еще одной попытке склонить  :) товарища на более грамотное решение по юзабилити...
Сделай ему мостра!  Пусть мучается, садист)

А вообще на словах сложно склонять, лучше сделать некую демку предлагаемого интерфейса, чтобы можно было щупать.
А просто говорить "это плохо" ни к чему не приведет. Нужно предлагать альтернативу.


Название: Re: Размещение множества сложных виджетов
Отправлено: vertus от Январь 07, 2012, 11:28
Если принципиально чтобы были именно виджеты, то можно попробывать такой вариант:

1. Выделить данные находящиеся на виджете в отдельную, не визуальную сущность - модель.
2. Создать виджет который может на лету принимать модель и перерисовывать себя.
3. Сделать тысячю экземпляров моделей (для каждого виджета).
4. Создать на экране ровно столько виджетов, сколько должно отображаться в данный момент времени.
5. При прокрутке менять модели виджетов отображающихся на экране.

Профит - реально создается несколько виджетов, а поскольку перерисовка в любом случае происходит, то времени на смену модели вообще не убъёт.

Цитировать
А вообще на словах сложно склонять, лучше сделать некую демку предлагаемого интерфейса, чтобы можно было щупать.
А просто говорить "это плохо" ни к чему не приведет. Нужно предлагать альтернативу.

Да тут все просто как я понял. Есть список из 1000 виджетов, а на каждом таком виджете ещё 300 виджетов. Естественно будет тормозить.

пока больше склоняюсь  к еще одной попытке склонить  :) товарища на более грамотное решение по юзабилити...

А потом эти товарищи заявляют какой тормозной этот Qt!  ;D


Название: Re: Размещение множества сложных виджетов
Отправлено: lit-uriy от Январь 07, 2012, 16:33
не асилил читать всю тему. Но вот первое что пришло в голову.
Когда делают пользовательский виджет, часто халтурят, ради экономии нескольких секунд на кодирование. Именно: в обработчике PaintEvent перерисовывают весь виджет, хотя можно было лишь небольшую область перерисовывать. Возможно в этом и проблема.


Название: Re: [Решено] Размещение множества сложных виджетов
Отправлено: antipart от Январь 11, 2012, 23:21
Вариант решения оказался тем, которого больше всего боялся, но на деле оказалось гораздо проще и быстрее чем думал... ;)
Если кому интересно:
Нарисовал таблицу на PaintEvent , подставляя текст из структуры данных. Далее на различных MouseEvent отслеживал
координаты курсора и выполнял необходимые действия:
Запихивал QRect-ы, которые планировались быть активными в QList-ы таким образом, чтобы индексы соответствовали индексам в списках с данными, которые нужно было править (правка через контекстное меню - у каждого может быть разное)
QLineEdit c комплитером создал один (для правки текста - сразу его hide()) и перемещал в нужные координаты, а после правки опять hide(); Комплитер с моделью, так что в разных случаях списки автодополнения легко менять...

Вобщем где-то так... Может, конечно, и кривовато, зато результат порадовал: 1000 таблиц летает замечательно...
время переключения на вкладку менее 0.5 сек. , а при 2000 - время переключения менее 1сек. Думаю можно еще более
оптимизировать если рисовать на QImage и обновлять не на PaintEvent, а при необходимости, но меня и это пока устраивает :)


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 12, 2012, 00:26
Мне интересно увидеть это чудо.
Как оно выглядит. Скрин.


Название: Re: Размещение множества сложных виджетов
Отправлено: _OLEGator_ от Январь 12, 2012, 09:22
Ага, в итоге реализовал свою собственную таблицу, вместо того, чтобы разобраться с Model/View и делегатами.


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 12, 2012, 14:20
Ага, в итоге реализовал свою собственную таблицу, вместо того, чтобы разобраться с Model/View и делегатами.
:) Если вам интересно и есть время разобраться с Model/View и делегатами, то пожалуйста, и с нами поделитесь если получится!
А у меня стояла конкретная задача , причем срочная...
Выкладываю несколько скринов, т.к. один полноценный на моем ноуте нельзя сделать(из-за разрешения).
Просто проект затачивается на широкий Mac c 2700 вширь!


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 12, 2012, 14:40
Вполне симпатично. Только двоеточия в шапках таблиц совершенно не к чему, это неверно.
Но так и не пойму какие сложности возникли с моделью. Через модель было бы быстрее сделать, чем ручками.

Кстати, какие преимущества дает эта программа, по сравнению с такой же сделанной в экселе. Тоже не пойму)


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 12, 2012, 14:55
Цитировать
Только двоеточия в шапках таблиц совершенно не к чему, это неверно.
Сделал как в образце... (хотят точь в точь -> получите ;))

Цитировать
Но так и не пойму какие сложности возникли с моделью.
Какие сложности я уже писал выше, а на исследование нет времени (проект итак уже горящий)

Цитировать
Через модель было бы быстрее сделать, чем ручками.
Не знаю не пробовал... а на это потратил день. :o

Цитировать
Кстати, какие преимущества дает эта программа, по сравнению с такой же сделанной в экселе. Тоже не пойму)
Ну во-первых это только маленькая часть программы(одна вкладка из 15), а основное отличие в функционале и удобстве, которого особо не видно на скринах (вкратце...например показ за разные месяцы или автогенерация дежурств для каждой  и  для всех таблиц сразу на основе предыдущего месяца и др. условий...)


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 12, 2012, 15:05
Цитировать
Только двоеточия в шапках таблиц совершенно не к чему, это неверно.
Сделал как в образце... (хотят точь в точь -> получите ;))
Может не нужно воспринимать все слишком буквально?
Я даже у самых бюрократистых бюрократов не видел двоеточия в шапке таблицы :) Это неграмотно.


Название: Re: Размещение множества сложных виджетов
Отправлено: andrew.k от Январь 12, 2012, 15:07
Да что там, я вообще никогда не видел двоеточия в шапке таблицы.
Попробуй найти (http://www.google.ru/search?client=opera&rls=ru&q=%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&oe=utf-8&channel=suggest&um=1&ie=UTF-8&hl=ru&tbm=isch&source=og&sa=N&tab=wi&ei=q8wOT4_DEJLS4QSr_YHAAw) сам)


Название: Re: Размещение множества сложных виджетов
Отправлено: antipart от Январь 12, 2012, 15:14
Может не нужно воспринимать все слишком буквально?
Я даже у самых бюрократистых бюрократов не видел двоеточия в шапке таблицы :) Это неграмотно.
Да вы правы 100 раз... Это я уже со зла... :( чуть остыну - уберу...


Название: Re: Размещение множества сложных виджетов
Отправлено: _OLEGator_ от Январь 12, 2012, 16:22
to antipart
вы потратили время с 4 января до 12 и в итоге написали все руками, вместо того, чтобы изучить и посмотреть примеры Model/View и QTableView, про которые уже сказано в первом ответе.
Лично я давно разобрался с моделями и не одну собственную сделал - механизм отработан и стандартен, чего и вам советую.