Многооконный дизайн Qt

Прошу прощения за длинный абзац, но это единственный способ объяснить это.

Основной вопрос: как мне иметь несколько окон с общими функциями пользовательского интерфейса, не помещая их все в один гигантский класс?

Моя ситуация: У меня есть вопрос относительно дизайна приложения, содержащего несколько окон. Окна будут иметь несколько общих компонентов пользовательского интерфейса (дата и время, батарея и т. д.). Каждое окно также будет иметь большую часть собственной функциональности пользовательского интерфейса. Моя первоначальная идея заключалась в том, чтобы иметь отдельные окна, чтобы класс был не таким большим и файлы пользовательского интерфейса было легче просматривать. Однако я обнаружил, что повторяю код для общей функциональности пользовательского интерфейса, поскольку мне приходится реализовывать его в каждом классе. Кроме того, я вынужден иметь много соединений между окнами, чтобы убедиться, что определенные вещи обрабатываются при смене окон.

Возможное решение: я читал, что QStackedWidget хорош для нескольких окон, но все будет в одном классе. Если, конечно, не существует способа обработки некоторых пользовательских интерфейсов в подклассе основного пользовательского интерфейса? Без создания других файлов пользовательского интерфейса?


person Community    schedule 26.01.2018    source источник
comment
Вы пробовали что-нибудь вообще, напишите свои классы и покажите их, чтобы помочь вам.   -  person Mohammad Kanan    schedule 26.01.2018


Ответы (1)


Я согласен с использованием QStackedWidget. Я обычно разрабатываю свои приложения со следующими идеологиями:

  1. Каждое окно/экран имеет свой собственный класс.
  2. Если есть повторение функциональности или кода, эта часть получает свой собственный класс (который наследуется каждым из оконных классов).
  3. Реализация QStackedWidget написана в первом классе, для которого main.cpp создает экземпляр объекта и показывает.
  4. Чтобы предотвратить чрезмерное использование памяти, я реализую класс, содержащий QStackedWidget, для динамического создания классов окон и их удаления (по мере необходимости). Это необязательно и будет зависеть от производительности вашего приложения на вашем устройстве.
person Aditya    schedule 26.01.2018
comment
Смогу ли я разработать динамические классы (виджеты в виджете стека) в пользовательском интерфейсе? Или я смогу проектировать только в main.cpp, потому что именно там находится пользовательский интерфейс? - person ; 26.01.2018
comment
Я понимаю, что могу создать класс и добавить его в составной виджет, но тогда мне придется разрабатывать интерфейс в этом классе с помощью кода, верно? - person ; 26.01.2018
comment
Под «динамическим» я подразумеваю фактическое выделение объекта при доступе и уничтожении, как только вы переходите на другой экран. Если вы хотите сделать это, вам нужен надлежащий контроль, и поэтому лучше на самом деле запрограммировать это поведение, а не перетаскивать его внутри пользовательского интерфейса. - person Aditya; 26.01.2018
comment
Кроме того, файл .ui не принадлежит main.cpp. Он используется в поколении ui_<className>.h. Класс использует этот заголовочный файл, чтобы показать ваш дизайн. Обратите внимание на ui->setupUi(this) в конструкторе. - person Aditya; 26.01.2018
comment
Если я динамически выделяю, а затем удаляю при переходе на другой экран, то зачем мне QStackedWidget? Если одновременно может быть активен только один виджет, почему бы просто не иметь виджет в пользовательском интерфейсе, который станет любым динамически выделяемым виджетом? Я знаю, что qstackedwidget предназначен для хранения нескольких окон, но в этом случае одновременно существует только одно окно (помимо окна управления) - person ; 26.01.2018
comment
Кроме того, да, я понимаю, что пользовательский интерфейс принадлежит классу, а не основному. Я не хотел этого говорить. - person ; 26.01.2018
comment
Вы можете иметь это в любом случае (выделить/освободить или нет). В этой конкретной идее я использую QStackedWidget исключительно как обработчик. Я чувствую, что так проще с этим справиться, потому что иногда один или два виджета остаются общими для всех экранов (например, виджет строки состояния). - person Aditya; 26.01.2018
comment
Но да, если вы хотите, чтобы все виджеты всегда оставались активными, вы можете это сделать. Я стараюсь свести к минимуму требования к памяти, так как в основном разрабатываю встроенные устройства - отсюда и такой подход. - person Aditya; 26.01.2018
comment
Это то, что я бы назвал Dynamic Tiered Approach. У меня постоянно активен 1 главный экран. Второстепенные экраны, такие как экран настроек и информационный экран, не обязательно должны быть активны все время — я бы использовал динамическую идею для вторичных, а не основных экранов. - person Aditya; 26.01.2018
comment
Я согласен с тем, что у меня должен быть главный экран, а затем динамически выделять другие окна, когда это необходимо. У меня есть верхняя панель (например, строка состояния), которую будут использовать все окна. У меня может быть только одно окно за раз. Главным экраном будет экран с полосой. Я все еще не понимаю, как QStackeWidget будет полезен, если у нас будет только одно вторичное окно за раз. Добавить его в сложенный виджет, а потом удалить при смене экрана? Это означало бы, что только одно окно находится в стекированном виджете одновременно. - person ; 26.01.2018
comment
Да, при таком подходе у вас будет по одному вторичному экрану (и дополнительные уровни, если этот вторичный экран имеет большую глубину). Не знаю, что вас здесь беспокоит. - person Aditya; 26.01.2018
comment
Переместите строку состояния в отдельный класс QWidget и по возможности поместите ее над QStackedWidget в своем основном классе. Таким образом, вам не придется возиться с этим снова. - person Aditya; 26.01.2018
comment
Главное окно класса имеет stackedWidget. Window1 добавляется в составной виджет. Window1 имеет кнопку в своем классе, которая создает динамический Window1_level1. Итак, главному окну необходимо подключение к окну1, чтобы знать, когда добавить дополнительный уровень к его многоуровневому виджету? Это то, о чем ты думаешь? - person ; 26.01.2018