Компоновка виджетов.
QLayout, QDockWidget, QMdiArea, qt5
Здравствуйте.
Есть программа в которой формируется набор различных компонентов
(виджет) и нужно составить из них пользовательский интерфейс с
возможностью изменять положение и размеры каждого компонента.
Я использовал QMdiArea, но возникла проблема с восстановлением
геометрии QMdiSubWindow т.к. окна не находятся на слое и их размер не
привязан к основному окну.
Вариант с QMainWindow + QDockWidget тоже использовался, однако это не
совсем то что хотелось получить, да и смотрится это ужасно(если
использовать в данном ключе).
Хочется перенести идею по компоновке из QtDesigner, но не представляю как...
Подскажите как можно решить данную проблему или в каком направлении двигаться.Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Добрый день.
Посмотрел наш проект. Нет, у нас используется QMdiArea и такая идея как в QtDesigner и рядом не лежала.
Но есть несколько вариантов, или отрисовка на QGraphicsView и QGraphicsScene. Там можно перетаскивать объекты. На сайте есть такой пример , рекомендую также почитать комментарии, там есть полезная информация.
Также, думаю, что можно создать Widget, в который вы можете помещать объекты без QLayout и перетаскивать их мышкой с абсолютным позиционированием, как жто сделано с переопределнием событий мыши в статье, которую я вам дал. Но там скорее всего нужно будет переопределить все виджеты, которые у вас есть или поведение виджета который будет содержать в себе эти виджеты.
Вообще, если я начинаю правильно понимать вашу задачу, то лучшим решением будет глянуть то, как это сделано в исходниках QtDesigner, поскольку задача не самая простая по факту.
Более кастомный вариант, это определить области компоновки и переопределить методы drag and drop, так можно будет сделать перетаскивание виджетов. Полностью для виджетов не пробовал это... Но кое-что делал, это вполне возможно реализовать, как я думаю.
Тут пока скорее направление получится подсказать. Конкретный пример равносилен реализации всей вашей программы, по крайней мере той части...
Была идея с QGridLayout (пример http://doc.qt.io/qt-5/qtwidgets-layouts-flowlayout-example.html )и переопределенными drag&drop, но Все дороги ведут в QtDesigner.
Большое спасибо. Надеюсь все окажется проще, чем выглядит.
Мне кажется, что у вас нет концепции того, как должен компоноваться интерфейс.
Если дать пользователю возможность компоновать его как захотите, то придёте к ситуации, что у вас целая куча костылей на каждый чих, и при этом эти костыли занимают половину логики вашей программы.
Я не знаю, какое конкретно приложение вы пишите, но думаю, что вы ещё до конца не продумали концепцию. То, что в Qt Designer реализовано, то это всего лишь компоновка виджетов и там тоже есть свои правила, но Qt Designer для этого и предназначен, чтобы накидать виджетов и сгенеровать код.
Возможно вам будет удобно какое-то иное решение, например, как компануются редакторы кода в самом Qt Creator.
Вы правы, пока что нет концепции.
В общем суть программы, есть блоки-источники информации, их можно соединить с обработчиками или с виджетами отображения(стрелочный прибор, цифровой индикатор и т.д.). Собственно эта часть очень хорошо реализовалась с QGraphicsView и QGraphicsScene. После этого я собираю все блоки отображения и помещаю их на QMdiArea, где располагаю их как хочу. Проблема только в сохранении геометрии окон(saveGeometry).
А у вас этот будет деляться в стиле UML диаграм? типо соединение различных циферблатов, индикаторов и т.д. между собой стрелками? или какими-то связями?
Если так, то мне кажется, что вам лучше будет и дальше работать с QGraphicsView и QGraphicsScene. Вот идея по соединению объектов линиями . И ещё думаю, что вам может пригодиться статья по примеру векторного редактора .
Главная идея в том, что информацию о графической сцене можно будет сохранить в XML или JSON а потом снова счтитать. Это же у вам по сути конфиг нужен будет. Кстать сохранение геометрии тоже можно сохранять в конфиг, а потом восстанавливать.
Т.е. есть блок у которого уникальный id, который может отдать объект виджета. Если взять стрелочный прибор, то он имеет один вход. Сам механизм отрисовки стрелок, шкалы и т.д. спрятан в виджете. Похоже на NodeEditor из blender'a.
Понятно. Знаете, вам тогда точно QGraphicsView нужно использовать. У вас же по сути область отрисовки объектов с вольной компоновкой. Вам нужно только реализовать перетаскивание и сохранение информации об этих объектах. А для сохранения и восстановления можно использовать или XML, или JSON.
Также у графической сцены есть метод addWidget(), через него можете добавлять виджеты на графическую сцену.