Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
p
Dec. 3, 2018, 2:09 p.m.

Компоновка виджетов.

QLayout, QDockWidget, QMdiArea, qt5

Здравствуйте.

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

Я использовал QMdiArea, но возникла проблема  с восстановлением геометрии QMdiSubWindow  т.к. окна не находятся на слое и их размер не привязан к основному окну.

Вариант с QMainWindow + QDockWidget тоже использовался, однако это не совсем то что хотелось получить, да и смотрится это ужасно(если использовать в данном ключе).

Хочется перенести идею по компоновке из QtDesigner, но не представляю как...

Подскажите как можно решить данную проблему или в каком направлении двигаться.
7

Добрый день.

Посмотрел наш проект. Нет, у нас используется QMdiArea и такая идея как в QtDesigner и рядом не лежала.

Но есть несколько вариантов, или отрисовка на QGraphicsView и QGraphicsScene. Там можно перетаскивать объекты. На сайте есть такой пример , рекомендую также почитать комментарии, там есть полезная информация.

Также, думаю, что можно создать Widget, в который вы можете помещать объекты без QLayout и перетаскивать их мышкой с абсолютным позиционированием, как жто сделано с переопределнием событий мыши в статье, которую я вам дал. Но там скорее всего нужно будет переопределить все виджеты, которые у вас есть или поведение виджета который будет содержать в себе эти виджеты.

Вообще, если я начинаю правильно понимать вашу задачу, то лучшим решением будет глянуть то, как это сделано в исходниках QtDesigner, поскольку задача не самая простая по факту.

Более кастомный вариант, это определить области компоновки и переопределить методы drag and drop, так можно будет сделать перетаскивание виджетов. Полностью для виджетов не пробовал это... Но кое-что делал, это вполне возможно реализовать, как я думаю.

Тут пока скорее направление получится подсказать. Конкретный пример равносилен реализации всей вашей программы, по крайней мере той части...

0
p
  • Dec. 3, 2018, 4:54 p.m.
  • (edited)

Была идея с QGridLayout (пример http://doc.qt.io/qt-5/qtwidgets-layouts-flowlayout-example.html )и переопределенными drag&drop, но Все дороги ведут в QtDesigner.

Большое спасибо. Надеюсь все окажется проще, чем выглядит.


0

Мне кажется, что у вас нет концепции того, как должен компоноваться интерфейс.

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

Я не знаю, какое конкретно приложение вы пишите, но думаю, что вы ещё до конца не продумали концепцию. То, что в Qt Designer реализовано, то это всего лишь компоновка виджетов и там тоже есть свои правила, но Qt Designer для этого и предназначен, чтобы накидать виджетов и сгенеровать код.

Возможно вам будет удобно какое-то иное решение, например, как компануются редакторы кода в самом Qt Creator.


0
p
  • Dec. 4, 2018, 1:31 p.m.

Вы правы, пока что нет концепции.

В общем суть программы, есть блоки-источники информации, их можно соединить с обработчиками или с виджетами отображения(стрелочный прибор, цифровой индикатор и т.д.). Собственно эта часть очень хорошо реализовалась с QGraphicsView и QGraphicsScene. После этого я собираю все блоки отображения и помещаю их на QMdiArea, где располагаю их как хочу. Проблема только в сохранении геометрии окон(saveGeometry).

0

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

Если так, то мне кажется, что вам лучше будет и дальше работать с QGraphicsView и QGraphicsScene. Вот идея по соединению объектов линиями . И ещё думаю, что вам может пригодиться статья по примеру векторного редактора .

Главная идея в том, что информацию о графической сцене можно будет сохранить в XML или JSON а потом снова счтитать. Это же у вам по сути конфиг нужен будет. Кстать сохранение геометрии тоже можно сохранять в конфиг, а потом восстанавливать.


0
p
  • Dec. 4, 2018, 2:27 p.m.

Т.е. есть блок у которого уникальный id, который может отдать объект виджета. Если взять стрелочный прибор, то он имеет один вход. Сам механизм отрисовки стрелок, шкалы и т.д. спрятан в виджете. Похоже на NodeEditor из blender'a.

0

Понятно. Знаете, вам тогда точно QGraphicsView нужно использовать. У вас же по сути область отрисовки объектов с вольной компоновкой. Вам нужно только реализовать перетаскивание и сохранение информации об этих объектах. А для сохранения и восстановления можно использовать или XML, или JSON.

Также у графической сцены есть метод addWidget(), через него можете добавлять виджеты на графическую сцену.



0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
V
Feb. 14, 2019, 6:41 p.m.
Vlad15007

Спасибо огромное! Заработало!
А
Feb. 12, 2019, 9:26 a.m.
Александр90

Сам разборался, спасибо.
А
Feb. 12, 2019, 8:19 a.m.
Александр90

День добрый! Можешь выложить форму mainwindow.ui от урока? Заранее спасибо
Feb. 11, 2019, 10:51 a.m.
Евгений Легоцкой

Нет, у меня проблема с жёстким диском случилась, занимался восстановлением ПК, ещё пару вечеров придётся этим заниматься, увы.
Now discuss on the forum
Feb. 15, 2019, 9:22 p.m.
IscanderChe

Доброй ночи.Скромно напоминаю о своём вопросе...
Feb. 15, 2019, 3:36 p.m.
Евгений Легоцкой

Ну я тут нашёл одно решение, но сам его не проверял. Вам нужно помещать фамилии скорее всего в ячейки заголовка, и потом просто перерисовывать их QHeaderView * header = m_ui->tableWidget...
Feb. 15, 2019, 7:53 a.m.
Евгений Легоцкой

Добрый день! Не работал с remoteobjects, поэтому глянул документацию, чтобы рассмотреть, что это за зверь. После просмотра документации сложилось стойкой впечатление, что это вполне возм...
m
Feb. 14, 2019, 6:28 p.m.
mr_roman

Нашел решение на Java. Удалось интегрировать в проект сервиса на Qt, теперь из Qt запускаю Java-код акселерометра.
Feb. 14, 2019, 11 a.m.
Евгений Легоцкой

ok. I see. You changed related name Try this {% if goal.joined.all|user_in:request.user %}
Join us in social networks

For registered users on the site there is a minimum amount of advertising