Название: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: navrocky от Июнь 23, 2010, 16:25 Делаю конструктор интерфейса. Хочется комбинировать QWidget'ы с графическими элементами. Например, положить кнопку а на ней произвольно разложить иконки и текст. В дальнейшем планируется строить деревья, таблицы комбинированием простых панелек, и заодно конструктор печатных форм, это накладывает требование по одновременному присутствию на экране большого числа различных панелек. QWidget'ы при большом количестве начинают сильно тормозить. Решил попробовать сделать все это с помощью QGraphicsScene, т.к. она позволяет вкладывать виджеты в сцену. Да и в хелпе однозначно написано: "in some cases you can now use Graphics View for advanced MDI applications." это вроде как раз мой случай.
Накидал пример, и возникли проблемы с отображением :'(. В общих чертах:
Хотелось бы найти соратника по несчастью, кто с этой темой разбирался, как все это можно лечить... Или может есть другой подход? ??? Скриншот багов с пояснениями: (http://vlad.visualdata.ru/bugs.png) Схема компонентов следующая: (http://vlad.visualdata.ru/struct.png) Код: Код: boost::shared_ptr<QDialog> dlg(new QDialog); qgraphics_window - простая обертка над QGraphicsView. Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: vipet от Июнь 23, 2010, 17:49 Или может есть другой подход? ??? Глянь Qt Quick здесь: http://labs.trolltech.com/blogs/2010/05/06/qt-creator-and-beyond-quick/ и в других местах Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: navrocky от Июнь 23, 2010, 23:07 Посмотрел, но что-то легче не стало :-\ Насколько я понял это для свистоперделок на основе QML. А мне нужно смесь из обычных компонентов на базе QWidget с легкими (типа кубик, картинка, текст) которых может быть много.. Чтобы одно на другое можно было ложить...
Вот, интересно, плазма в кедах вроде через QGraphicsScene тоже сделана, там кнопки визуально нормально выглядят, без фона. * Ушел качать исходники кед и ковыряться в них Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: navrocky от Июнь 23, 2010, 23:18 Хотя нет, в плазме наблюдаются те-же глюки
(http://vlad.visualdata.ru/plasma-bugs.jpg) Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: GreatSnake от Июнь 24, 2010, 15:36 Цитировать эмбеддят всплывающие меню, что не радует и не понятно как отключить Дело в том, что тролли не дают нам контролировать создание контекстного меню >:(Почему нельзя было сделать метод createStandardContextMenu() virtual мне непонятно. Вот так можно решить проблему встроенного меню: Код Использовать созданное троллями меню мне никак не получилось. Оно всё-равно оставалось embedded чтобы я ни делал :( Пришлось создавать своё использую его actions. Цитировать не работают нормально лайоуты с QGraphicsWidgetProxy Вроде нормально работают.Я не совсем понял почему вы не повесили на QGroupBox обычный layout и уже на него добавили QPushButton и QLineEdit? Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: navrocky от Июнь 24, 2010, 17:05 Дело в том, что тролли не дают нам контролировать создание контекстного меню >:( Почему нельзя было сделать метод createStandardContextMenu() virtual мне непонятно. Вот так можно решить проблему встроенного меню: Использовать созданное троллями меню мне никак не получилось. Оно всё-равно оставалось embedded чтобы я ни делал :( Пришлось создавать своё использую его actions. Спасибо за код, попробую. :) Но еще остаются всплывающие окна другого типа - в комбобоксах например ( Сейчас внимательно изучал сырцы Qt http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/graphicsview/qgraphicsproxywidget.cpp, так и не усмотрел, каким образом эмбеддятся дочерние окна и как на это можно повлиять извне :( Только что углядел такой флаг в хелпе Qt::BypassGraphicsProxyWidget, может это оно самое? Цитировать Вроде нормально работают. Я не совсем понял почему вы не повесили на QGroupBox обычный layout и уже на него добавили QPushButton и QLineEdit? У меня потребность, чтобы все виджеты на сцене имели под собой QGraphicsProxyWidget, поэтому я так сделал. Сейчас попробовал по вашему совету сперва создать QGroupBox, QVBoxLayout, QPushButton и QLineEdit, а потом все компоненты разобрать на QGraphicsProxyWidget и всё получилось! ) Из этого получается вывод, что с QWidget'ами нельзя использовать QGraphicsLayout. Остается еще одна нерешенная проблема - все контролы рисуются с фоном, если они сидят каждый в своем прокси.... Как бороть? Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: GreatSnake от Июнь 24, 2010, 17:31 Цитировать Только что углядел такой флаг в хелпе Qt::BypassGraphicsProxyWidget, может это оно самое? Я этот флаг пробовал. Ведёт он себя как-то странно.Если его выставить виджету повешенному на QGraphicsProxyWidget, то этот виджет пропадает. Ежели виджету созданному на одном из потомков QGraphicsProxyWidget, то popup-menu QLineEdit становится не-embedded, но выплёвывется не там где нужно. Цитировать Но еще остаются всплывающие окна другого типа - в комбобоксах например ( Сдаётся мне, что тролли сделали такое поведение popup-окон специально :(Кстати, заметил одну странную вещь. У виджетов созданных без родителя и помещённых в QGraphicsProxyWidget родитель не выставляется. Ежели задать родителя при создании, то в QGraphicsProxyWidget он уже не помещается. Вообщем, имхо, всё это еще очень сыро ( Цитировать Остается еще одна нерешенная проблема - все контролы рисуются с фоном, если они сидят каждый в своем прокси.... Как бороть? Может через CSS получится?Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: navrocky от Июнь 24, 2010, 18:26 Цитировать Цитировать Но еще остаются всплывающие окна другого типа - в комбобоксах например ( Сдаётся мне, что тролли сделали такое поведение popup-окон специально :(Цитировать Кстати, заметил одну странную вещь. У виджетов созданных без родителя и помещённых в QGraphicsProxyWidget родитель не выставляется. Ежели задать родителя при создании, то в QGraphicsProxyWidget он уже не помещается. Ну родительские отношения возможны, если корневой QWidget запихнуть в прокси. Тогда можно его как парента использовать. Цитировать Вообщем, имхо, всё это еще очень сыро ( Это да. Но будем надеяться допилят, так как в кедах плазма на этом работает...В последних коммитах я видел правки багов с контекстным меню для qt 4.7.. Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: GreatSnake от Июнь 25, 2010, 12:47 Кстати, может пригодится.
QGraphicsScene при обработке QEvent::WindowАctivate/QEvent::WindowDeactivate посылает эти события всем элементам сцены. Т.е. если окно потеряет/получит фокус, то все элементы будут перерисовываться. Такая тупая политика может дико тормозить, если элементов будет много. Единственным решением этой проблемы, это перегрузить QGraphicsScene::event(). Название: Re: Qt4.6.2. Проблемы. Конструктор интерфейса с использованием QGraphicsScene. Отправлено: navrocky от Июнь 25, 2010, 15:12 Я уже решил забросить QGraphicsScene для рисования интерфейса ;D Что-то глюков много..
Буду делать аналог, свою иерархию итемов: Код: item widget_item будет путем навешивания фильтра на ассоциированный QWidget будет рисовать дочерние graphics_item'ы. Плюс к этому придется сделать диспетчеризацию событий и фокуса к graphics_item'ам %) Во всяком случае, пока не вижу подводных камней, почему у меня это не получится... |