Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
p
3 декабря 2018 г. 14:09

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

QLayout, QDockWidget, QMdiArea, qt5

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

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

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

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

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

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

Добрый день.

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

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

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

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

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

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

0
p
  • 3 декабря 2018 г. 16:54
  • (ред.)

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

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


0

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

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

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

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


0
p
  • 4 декабря 2018 г. 13:31

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

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

0

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

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

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


0
p
  • 4 декабря 2018 г. 14:27

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

0

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

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



0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
НБ
15 февраля 2019 г. 13:09
Николай Булахтин

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
НБ
15 февраля 2019 г. 13:03
Николай Булахтин

C++ - Тест 002. Константы

  • Результат:25баллов,
  • Очки рейтинга-10
НБ
15 февраля 2019 г. 13:01
Николай Булахтин

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
Последние комментарии
V
14 февраля 2019 г. 18:41
Vlad15007

Спасибо огромное! Заработало!
А
12 февраля 2019 г. 9:26
Александр90

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

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

Нет, у меня проблема с жёстким диском случилась, занимался восстановлением ПК, ещё пару вечеров придётся этим заниматься, увы.
Сейчас обсуждают на форуме
15 февраля 2019 г. 21:22
IscanderChe

Доброй ночи.Скромно напоминаю о своём вопросе...
15 февраля 2019 г. 15:36
Евгений Легоцкой

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

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

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

ok. I see. You changed related name Try this {% if goal.joined.all|user_in:request.user %}
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы