2012-01-01 53 views
3

我正在寻找最佳实践或设计模式来管理Qt应用程序的窗口。在Qt应用程序中是否有标准化的窗口管理方式?

让我解释一下我的意思。假设我有一个具有一些窗口(A,B,C)的应用程序,并且我需要在window B内打开window A,并确保每次调用时都会创建一个带有有效参数的新实例window A,并且最后需要显示如果有其他创建新实例,则窗口C会将现有实例放在前面。

当然,真实世界的应用程序要复杂得多,并且有更多的窗口和限制,所以我不想在整个代码中传播我的窗口管理操作,并将它们保存在一个静态的WindowManager类中。 (其实这个类是一个单身,但我正在考虑把它变成一个静态类)

窗口管理类包含一个(私人)QSharedPointer为系统中的每个窗口,所以我可以很容易地从代码的任何地方操控所有窗口。当我需要显示window X时,我只需拨打WindowManager::showX(params),所有检查和初始化都在该代码中进行。此外,我有像WindowManager::minimizeX()方法来处理一些逻辑,显示系统托盘消息,然后尽量减少窗口。

这是一种常见的需求,是否存在解决问题的一般模式?你们如何管理你的应用程序的窗口?我所做的(静态WindowManager类)是否可以接受?


编辑:该应用程序是一个系统托盘应用程序,所以窗口之间没有父子关系;相反,它们都是相互独立的,一般用户通过(全局)热键调用任何窗口。然而,有一些情况是我需要打开另一个窗口,但仍然不能成为父母和孩子。

+1

不能说我已经写了任何如此复杂的东西。通常,具有各种对话的主窗口,模态或不需要。处理特定窗口的代码进入该窗口的类。如果该窗口/对话框需要另一个对话框,它将管理所述对话框的设置,但逻辑全部在辅助对话框的类中。有什么可以阻止你使用该模型吗? – casualcoder 2012-01-02 03:20:47

+0

通常父母设立自己的孩子。创建子部件,配置它,启动它。如果有主窗口,那个主窗口通常会处理许多次窗口。没有看到可以将这么多代码分解成一个专门用于窗口创建和管理的独立类,并且这将是一个很好的设计(单例几乎从不)。 – 2012-01-02 06:36:02

+0

@casualcoder:实际上我的应用程序在其大部分时间驻留在系统托盘中,用户通过不同的(全局)热键触发不同的窗口,并且窗口之间没有父子关系。窗口可以在另一个窗口中调用或通过热键打开。这导致我有这样一个问题。 – destan 2012-01-02 07:25:20

回答

0

看起来这是一个简单的日复一日的问题,因为还没有任何答案的问题?这对于评论来说太长了,所以我会将它作为答案发布,但仍希望其他人发布最终的通用启蒙模式,但是;)我希望我有一个适合所有时间的一般模式。

无论如何,我不会把所有的东西都放到WindowManager中,因为它在它和所有窗口之间创建了非常强的耦合。这个类可能会变得非常大,因为它包含了所有复杂的规则(你所说的“真实世界的应用程序” - 想象在一个类中处理100个窗口..)。它可能变得很难测试和容易出错,因为一个部分的变化可能会无意中影响其他部分(想象一个用于五个窗口的bool,翻转它,它可能工作四次,而一个开始奇怪地行动)。有一天它可能会阻止你在别的地方重复使用某些窗口(比如在另一个程序中,或者仅仅在同一个程序的另一部分中),因为它们需要WindowManager类,而WindowManager类又需要所有其他窗口,所以你不能移动这个窗口在别的地方,因为它会拖动所有其他窗口。

我想尝试创建窗口的逻辑组,并尝试处理他们与几个较小的控制器的交互。也许你可能想看看MVC模式。让控制器决定如何操作模型以及根据用户输入显示哪些视图。

相关问题