Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bepec от Январь 14, 2014, 10:04



Название: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 14, 2014, 10:04
Приветствую заглянувших.

Собственно поставил я себе цель написать не торопясь программу-аналог для построения UML схем. Точнее набраться практики по данному направлению разработки.
Чтобы было яснее - скриншот.
(http://softoroom.net/images/server3/out.php/i2586_screenshot.jpg)

Подумал над архитектурой и решил что QGraphicsView и Scene будут в самый раз.
Создал виджет, запихнул его в Scene и понял, что взаимодействие виджетов со сценой не проработано (Qt 4.7.2). Передвигать нельзя, если пользоваться сторонними классами, взятыми с этого форума (для растягивания и перетягивания), то теряется фокус и прочие прелести.

Внимание, вопрос:
1) Правильно ли я выбрал инструменты (QGraphicsView/Scene) или есть более подходящие.
2) Как лучше сделать?
       QGraphicsItem с данными, с которым будет разбираться сцена.
       Виджет с собственной логикой, внедрённый в Scene.

Пока это все вопросы, но в дальнейшем добавится больше.

PS если есть ссылки на уроки с QGraphicsView, то буду благодарен.
PPS долго сомневался куда засунуть тему. Не решил...


Название: Re: QGraphicsView + Виджеты.
Отправлено: _OLEGator_ от Январь 14, 2014, 10:54
Все верно, для такой задачи QGraphicsView/Scene подходит. Только не надо создавать виджет и пихать его в сцену, надо переопределять QGraphicsItem и от него плясать свои собственные айтемы.
Не понял, почему не удалось передвинуть виджет, этот механизм рабочий и в чем именно не проработано взаимодействие виджетов со сценой тоже не ясно.
Я достаточно плотно работал со сценой, так что могу помочь - задавай вопросы.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Fregloin от Январь 14, 2014, 11:29
Открою вам секрет, что программа которая на экране с вероятностью 95% написана с использованием GraphicsScene.
И зачем пихать виджеты на сцену? Вам нужно видеть поля ввода, комбобоксы и т.п. элементы ввода/вывода? На сколько я понял в диаграмах UML такие компоненты не используются,
поэтому достаточно переопределить свои элементы. Если нужно генерить сигналы наследуйтесь от GraphicsObject.


Название: Re: QGraphicsView + Виджеты.
Отправлено: xokc от Январь 14, 2014, 12:25
Открою вам секрет, что программа которая на экране с вероятностью 95% написана с использованием GraphicsScene.
Тут промах - Delphi 7 Update 1 (http://staruml.sourceforge.net/en/development-setting.php (http://staruml.sourceforge.net/en/development-setting.php))
Да и на скриншоте Дельфовое наследие со всех щелей прёт (не говорю, что это плохо!).


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 14, 2014, 20:38
to  _OLEGator_:
При пробросе виджета через addWidget сцены, виджет не реагирует на попытки его перенести и флаг не помогает. Это не единичная проблема (тут пара тем на эту проблему есть.)

to Fregloin:
Нужны и поля ввода и автоподстановка. На скрине "неактивная схема" При наведении указателя появляются кнопочки работы с элементом. Разные поля - разные контекстные меню. В каждом поле можно щелкнуть и будет добавлен элемент в поле и открыт для редактирования, типа lineEdit.


Т.е. всё таки лучше наследоваться от graphicsItem'a и давать сцене решать все вопросы. А как быть с редактируемыми полями?
Т.е. graphicsItem создали, он красиво отрисовывает данные. И вот хочется их изменить - вызвать lineEdit что ли. Или самому придётся писать велосипед для этой цели?

PS извиняюсь за вопросы "без попыток", завтра отнаследуюсь и отпишусь ещё. Спасибо за ответы.


Название: Re: QGraphicsView + Виджеты.
Отправлено: _OLEGator_ от Январь 14, 2014, 20:47
Все виджеты работают на сцене и таскаются, в чем конкретно проблема?


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 14, 2014, 22:15
Создаём собственный виджет, кидаем на него пару listWidget + lineEdit + label, добавляем компоновщик. Пихаем сие чудо в scene. Тык на него мышкой - а оно и не работает. Выставляем флаг itemMovable, реакция нулевая.


Название: Re: QGraphicsView + Виджеты.
Отправлено: _OLEGator_ от Январь 14, 2014, 22:23
Давай минимальный проект - с ним проще будет работать, не мне же его создавать.
Сейчас глянул - у сцены похоже до сих пор глюк с выделением QGraphicsProxyWidget остался - надо самому вызывать выделение по нажатию в режиме редактирования, тогда он и таскаться начнет:
http://www.qtcentre.org/threads/28434-Move-QGraphicsProxyWidget


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 14, 2014, 22:25
Дико извиняюсь, но завтра. Сегодня башка раскалывается :)


Название: Re: QGraphicsView + Виджеты.
Отправлено: Racheengel от Январь 14, 2014, 22:52
Веселая тема :) Я как то хотел аналог визио и инкскейпа сделать... Тоже на сцене, но это было еще кути 4.0, там сцена вообще отдельным солюшеном шла.
Но да, такое я бы только на сцене и делал. Не знаю за 4.8 и 5.х, но в 4.7 были дикие глюки с виджетами в ней...


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 15, 2014, 07:09
Пример, как и обещал. В архиве pro и sln (VS2008).


Название: Re: QGraphicsView + Виджеты.
Отправлено: GreatSnake от Январь 15, 2014, 07:43
Но да, такое я бы только на сцене и делал.
Тем не менее designer у Qt-ишников сцену не использует)


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 15, 2014, 07:45
Я вот тут думаю, не написать ли свой велосипед.
Ибо пока не могу понять как сделать так, чтобы можно было редактор вызывать в итеме. Или над итемом. В общем пробую :D


Название: Re: QGraphicsView + Виджеты.
Отправлено: GreatSnake от Январь 15, 2014, 07:48
Я вот тут думаю, не написать ли свой велосипед.
Ибо пока не могу понять как сделать так, чтобы можно было редактор вызывать в итеме. Или над итемом. В общем пробую :D
Обычно для таких целей используют невидимый айтем-виджет-контейнер, который уже будет и двигать и резайзить своего потомка.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Fregloin от Январь 15, 2014, 11:19
В своей новой версии программы я именно так и сделал. Это намного лучше чем каждый элемент будет обрабатывать себя сам.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 16, 2014, 13:28
Собственно отнаследовался от GraphicsItem, минимальный функционал сделал.
Item'ы двигаются, изменяются при помощи редактора (справа снизу).

И вот тут возникают вопросы:
1) Как отобразить "редактор" прямо на item'e? Чтобы тыкнул и он перешёл в режим редактирования.

2) Как лучше сделать архитектуру связей?
Связь может быть односторонней. От одного объекта к второму.
Пока что я вижу два варианта
    - хранить список связей сценой. В данных связи будут храниться начальный и конечный пункт.
    - или же в каждом объекте хранить "его" связи.

3) Проблема - при добавлении итема "ribbonLine" впервые, сцена сбрасывается в центр начала координат. Это нервирует. Добавление остальных элементов такой оказии не вызывает.

4) может быть связана с предыдущей.
Как запретить сцене "разрастаться" стороны? Хочется чтобы центр системы координат был 0,0 и никак иначе. Верхний левый угол.

5) Есть ли уже готовая реализация, когда view сцены двигается при поднесении элемента к краю видимой области? В момент выноса за границу сцена растягивается. View же не двигается.




Название: Re: QGraphicsView + Виджеты.
Отправлено: AlexEx от Январь 16, 2014, 15:32
IMHO, здесь в наличии некоторое противоречие: что при движении мыши внутри lineEdit'а надо делать - перемещать lineEdit по сцене или выделять текст внутри него? Соответственно, появляются два режима (оба вполне реализуемых), которые надо как-то переключать.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 16, 2014, 15:33
Нет противоречия. При щелчке нужен переход в режим редактирования. Вот только как его реализовать, я даже не представляю. Создавать QLineEdit поверх мне кажется жутким :(


Название: Re: QGraphicsView + Виджеты.
Отправлено: Racheengel от Январь 17, 2014, 02:48
а если через QGraphicsProxyWidget?

в ассистенте как раз есть пример подобного функционала - перевод итема в режим редактора.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 17, 2014, 07:33
Где вы такие примеры видели? Прошу ссылку. В Qt Example/Demos такого не нашёл, вы явно не 40 тысяч чипов имеете в виду :)



Название: Re: QGraphicsView + Виджеты.
Отправлено: Hellraiser от Январь 17, 2014, 07:46
Немного похоже на функционал примера Diagram Scene из раздела Graphics View


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 17, 2014, 08:21
Его я уже смотрел. Там используются стандартные итемы QGraphicsItemЧтотоТам.

Они узкой направленности - просто текст, просто фигуры. Печально.

PS на другие вопросы ответов тоже нет, как я понял. Ужасно :D


Название: Re: QGraphicsView + Виджеты.
Отправлено: AlexEx от Январь 17, 2014, 09:14
В свое время писал похожий редактор. Мне тогда представилось более целесообразным иметь нередактируемые, но меняющие размер и положение, итемы, чей вид и содержание задаются через property browser. При редактируемых виджетах есть проблемы (решаемые) с выпадающими частями combobox'ов и меню, а также с объединением в группы.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 17, 2014, 09:26
Я вижу, что если редактировать с помощью проперти браузера - это... отвлекает от собственно работы с элементом.
Не поделитесь кодиком, если не закрыт? Может быть что-то полезного ещё почерпну.


Название: Re: QGraphicsView + Виджеты.
Отправлено: carrygun от Январь 17, 2014, 10:20
Property browser есть же в солюшене.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 17, 2014, 10:44
Спасибо carrygun, но я просил у человека его исходники, в которых будет работа с GraphicsView/Scene/Item. PropertyBrowser я и сам напишу.
Меня интересует работа со сценой и представлением.

PS если хотите ответьте на любой из синих вопросов в этой теме, мне это поможет :D


Название: Re: QGraphicsView + Виджеты.
Отправлено: carrygun от Январь 17, 2014, 11:00
Со сценой не возился, увы. А форум почитать люблю, глядишь и когда придет время со сценой работать - пригодится чего.


Название: Re: QGraphicsView + Виджеты.
Отправлено: AlexEx от Январь 17, 2014, 18:46
Кодом поделюсь, скорее всего в понедельник.


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 17, 2014, 18:51
Буду ждать первого луча понедельника :D


Название: Re: QGraphicsView + Виджеты.
Отправлено: Racheengel от Январь 18, 2014, 00:59
Где вы такие примеры видели? Прошу ссылку. В Qt Example/Demos такого не нашёл, вы явно не 40 тысяч чипов имеете в виду :)

Qt Assistant, тема QGraphicsProxyWidget.
Там далее по тексту примеры кода, в частности: Embedding a Widget with QGraphicsProxyWidget


Название: Re: QGraphicsView + Виджеты.
Отправлено: Nidxogg от Январь 19, 2014, 10:16
Цитировать
Нет противоречия. При щелчке нужен переход в режим редактирования. Вот только как его реализовать, я даже не представляю. Создавать QLineEdit поверх мне кажется жутким Грустный
Если редактировать текст, то может быть подойдет банальный QGraphicsTextItem?

А что подразумевается под редактированием итема?


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 19, 2014, 11:14
https://www.dropbox.com/sh/g9aeb3nnvfk57jk/3a4Qcz2HF7/Gif#lh:null-1.gif


Название: Re: QGraphicsView + Виджеты.
Отправлено: AlexEx от Январь 19, 2014, 19:48
To Bepec: Куда заслать проект, он довольно большой?


Название: Re: QGraphicsView + Виджеты.
Отправлено: Bepec от Январь 29, 2014, 12:14
Собственно появился простейший наверно вопрос:

При установке новых значений в item он меняет размер.
Если идёт увеличение размеров, то всё нормально.
Если идёт уменьшение, тогда та часть виджета, что "исчезла" остаётся на сцене. Можно её затереть если обновить сцену, или же итемом как "стёркой" провести. Как правильно нужно реализовывать изменение размеров чтобы не было таких накладок?


Название: Re: QGraphicsView + Виджеты.
Отправлено: _OLEGator_ от Январь 29, 2014, 13:38
Если я все правильно понял, то речь идет об этом:
Код
C++ (Qt)
void QGraphicsItem::prepareGeometryChange () [protected]


Название: Re: QGraphicsView + Виджеты.
Отправлено: Fregloin от Январь 30, 2014, 11:05
Вот пример моей реализации. По понятным причинам многое пришлось затереть. Но суть простая, меняю свойства графического объекта (QGraphicsObject) через свой ObjectInspector.