2012-01-01 2 views
3

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

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

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

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

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


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

+1

Не могу сказать, что я написал что-то столь же запутанное, как это. Как правило, главное окно с множеством диалогов, модальное или нет по мере необходимости. Код для обработки конкретного окна входит в класс для этого окна. Если в этом окне/диалоговом окне требуется другое диалоговое окно, он управляет настройкой указанного диалога, но логика все в классе для вторичного диалога. Есть ли что-то, что мешает вам использовать эту модель? – casualcoder

+0

Обычно родители создают своих детей. Создайте дочерний виджет, настройте его, поднимите.Если есть главное окно, это главное окно часто заботится о многих вторичных окнах. Не видите, что этот фактор можно отнести к отдельному классу, посвященному созданию и управлению окнами, и это будет хороший дизайн (синглтоны почти никогда не бывают). –

+0

@casualcoder: на самом деле мое приложение находится в системном трее большую часть своего времени, и пользователь запускает разные окна разными (глобальными) горячими клавишами, и между окнами нет отношений между родителями и дочерними элементами. Окно можно вызвать в другом окне или открыть горячую клавишу. У меня такой вопрос. – destan

ответ

0

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

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

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

Смежные вопросы