Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
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, так можно будет сделать перетаскивание виджетов. Полностью для виджетов не пробовал это... Но кое-что делал, это вполне возможно реализовать, как я думаю.

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

Для Django рекомендую VDS-хостинг TIMEWEB

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

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

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


0

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

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

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

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


Для Django рекомендую VDS-хостинг TIMEWEB

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

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

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

0

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

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

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


Для Django рекомендую VDS-хостинг TIMEWEB

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

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

0

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

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



Для Django рекомендую VDS-хостинг TIMEWEB

0

Answers

Only authorized users can respond to the forum.
Please, login or register
Dec. 12, 2018, 6:49 p.m.
Yaroslav Chernetskyi

Qt - Test 001. Signals and slots

  • Result:31points,
  • Rating scores-10
Dec. 12, 2018, 6:19 a.m.
nikbobrecov

Qt - Test 001. Signals and slots

  • Result:57points,
  • Rating scores-2
Dec. 11, 2018, 6:59 p.m.
Feniks3000

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

  • Result:71points,
  • Rating scores1
Recent comments
Dec. 11, 2018, 9:01 p.m.
Евгений Легоцкой

Не знаю, какой-там конкретно эффект и если честно не хочется fl studio ради того, чтобы посмотреть устанавливать, но из того, что увидел в интернете. Предполагаю, что то, что вы хотите с...
Dec. 11, 2018, 7:25 p.m.
Vlad15007

Подскажите пожалуйста ( я новичок совсем)Можно ли организовать спрайт без этого окошка (как в fl studio fruity dance)?
Dec. 11, 2018, 3:06 p.m.
Евгений Легоцкой

Что интересно, если написать так from <application_name>.<module_name> import <filename> ,то PyCharm сносит крышу, если разрабатываешь в рамках проекта приложение, ко...
Dec. 11, 2018, 2:52 p.m.
Илья Чичак

Тут мне тоже есть что сказать=) Сами разрабы советуют импортировать следующим образом: from <application_name> import <module_name> Стоит избегать from . import &l...;
Dec. 11, 2018, 2:28 p.m.
Евгений Легоцкой

Твоя правда. Согласен. Свои миграции храню в репозитории. На продакшене только выполняю обновление структуры базы данных, после тестирования на дев сервере конечно (читай локальная машина разр...
Now discuss on the forum
Dec. 12, 2018, 5:52 p.m.
Михаиллл

Оказывается оно все переводит в нижний регистр и нужно так писать: SearchTableModel->setTable("\"Test2\"");
Dec. 12, 2018, 4:32 p.m.
Булат Гиниятов

Допустим в MyObject *myobject = new MyObject; есть метод start(){while(aaa){////////////////}} Как мне обратиться к методу stop(){aaa=false;} ? Соответственно по...
Dec. 12, 2018, 4:28 p.m.
xintrea

Как выяснилось в этом обсуждении: Отправка Email из Android в Qt для отправки Email в Android необходимо делать Java-метод, который и будет отправлять email. И этот Java-мет...
Dec. 12, 2018, 3:35 p.m.
lynx

если кому будет вдруг нужно, подумал я над предложением Евгения Но думаю, что проще какой-то функционал дополнить для TableView из Qt Quick Controls 2. вообще берем стандарт...
Dec. 12, 2018, 1:49 p.m.
Евгений Легоцкой

но у меня нет времени учиться ВЕЧНО давайте без истерик, вы это говорите человеку, который всю жизнь учился, учится и будет учиться, и в программировании всегда так, или учишься и...
Join us in social networks

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