p
per03 грудня 2018 р. 09:09

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

QLayout, QDockWidget, QMdiArea, qt5

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

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

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

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

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

Подскажите как можно решить данную проблему или в каком направлении двигаться.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

7
Evgenii Legotckoi
  • 03 грудня 2018 р. 09:36
  • (відредаговано)

Добрый день.

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

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

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

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

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

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

    p
    • 03 грудня 2018 р. 11:54
    • (відредаговано)

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

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


      Evgenii Legotckoi
      • 04 грудня 2018 р. 07:08
      • (відредаговано)

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

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

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

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


        p
        • 04 грудня 2018 р. 08:31

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

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

          Evgenii Legotckoi
          • 04 грудня 2018 р. 08:56
          • (відредаговано)

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

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

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


            p
            • 04 грудня 2018 р. 09:27

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

              Evgenii Legotckoi
              • 04 грудня 2018 р. 09:32
              • (відредаговано)

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

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



                Коментарі

                Only authorized users can post comments.
                Please, Log in or Sign up
                AD

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:50бали,
                • Рейтинг балів-4
                m
                • molni99
                • 26 жовтня 2024 р. 01:37

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:80бали,
                • Рейтинг балів4
                m
                • molni99
                • 26 жовтня 2024 р. 01:29

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:20бали,
                • Рейтинг балів-10
                Останні коментарі
                ИМ
                Игорь Максимов22 листопада 2024 р. 11:51
                Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                Evgenii Legotckoi
                Evgenii Legotckoi31 жовтня 2024 р. 14:37
                Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                A
                ALO1ZE19 жовтня 2024 р. 08:19
                Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                ИМ
                Игорь Максимов05 жовтня 2024 р. 07:51
                Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                d
                dblas505 липня 2024 р. 11:02
                QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                Тепер обговоріть на форумі
                Evgenii Legotckoi
                Evgenii Legotckoi24 червня 2024 р. 15:11
                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                t
                tonypeachey115 листопада 2024 р. 06:04
                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                NSProject
                NSProject04 червня 2022 р. 03:49
                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                9
                9Anonim25 жовтня 2024 р. 09:10
                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                Слідкуйте за нами в соціальних мережах