Есть ли стандартизированный способ управления окнами в приложениях Qt? - PullRequest
3 голосов
/ 02 января 2012

Я нахожусь в поиске лучшей практики или шаблона проектирования для управления окнами приложения Qt.

Позвольте мне объяснить, что я имею в виду. Скажем, у меня есть приложение, в котором есть несколько окон (A, B, C), и у меня есть такие потребности, как открытие window A в window B и обеспечение создания нового экземпляра window A с допустимыми параметрами при каждом его вызове. и, наконец, когда нужно показать, что окно C выводит существующий экземпляр вперед, если кто-либо еще создает новый экземпляр.

Конечно, реальное приложение намного сложнее и имеет больше окон и ограничений, поэтому я не хочу распространять свои операции по управлению окнами по всему коду и храню их в статическом WindowManager классе. (На самом деле этот класс является одноэлементным, но я собираюсь изменить его на статический класс)

Класс WindowManager содержит (приватный) QSharedPointer для каждого окна в системе, поэтому я могу легко манипулировать всеми окнами из любого места в коде. Когда мне нужно показать window X, я просто звоню WindowManager::showX(params), и все проверки и инициализация происходят в этом коде. Также у меня есть методы, такие как WindowManager::minimizeX() для обработки некоторой логики, отображения сообщения в системном трее и затем сворачивания окна.

Является ли это общей потребностью, и существует ли общая схема решения проблемы? Как вы, люди, управляете окнами ваших приложений? Что я сделал (статический класс WindowManager) приемлемо?


Редактировать: Приложение является приложением в системном трее, поэтому между окнами нет родительских и дочерних отношений; вместо этого они все независимы друг от друга, и обычно пользователь вызывает любое окно с помощью (глобальной) горячей клавиши. Однако есть несколько случаев, когда в одном окне мне нужно открыть другое окно, но они не могут быть родительскими и дочерними.

1 Ответ

0 голосов
/ 04 января 2012

похоже, что это простой вопрос изо дня в день, поскольку ответов пока нет? это слишком долго для комментария, поэтому я опубликую его как ответ, все еще надеясь, что кто-то еще опубликует окончательный общий образец просвещения, хотя;) Я бы хотел, чтобы у меня был общий образец, который бы подходил все время.

В любом случае, я бы не стал помещать все в «синглтон» WindowManager, поскольку он создает очень сильную связь между ним и всеми окнами. этот класс может стать очень большим, поскольку он содержит все сложные правила (вы сказали «приложение реального мира» - представьте, что 100 окон обрабатываются в одном классе ...). это может стать трудным для тестирования и подверженным ошибкам, поскольку изменения в одной части могут непреднамеренно повлиять на другие части (представьте, что bool используется для пяти окон ... переверните его, и он может работать для четырех, в то время как один начинает странно себя вести). и однажды это может помешать вам повторно использовать определенные окна в другом месте (например, в другой программе или просто в другой части той же программы), так как им нужен класс WindowManager, который, в свою очередь, нуждается во всех других окнах, поэтому вы не можете двигаться это одно окно где-то еще, потому что оно будет тянуть все остальные окна вместе.

Я бы попытался создать логические группы окон и попытаться обработать их взаимодействие с несколькими меньшими контроллерами. может быть, вы захотите взглянуть на шаблон MVC. пусть контроллеры решат, как манипулировать моделями и какие виды отображать в зависимости от пользовательского ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...