Qt应用程序中有标准化的管理窗口的方法吗?

Is there a standardized way of managing windows in Qt applications?

本文关键字:窗口 方法 管理 Qt 标准化 应用程序      更新时间:2023-10-16

我正在寻找管理Qt应用程序窗口的最佳实践或设计模式。

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

当然,现实世界的应用程序要复杂得多,有更多的窗口和限制,所以我不想把我的窗口管理操作扩展到所有的代码中,我把它们放在一个静态的WindowManager类中。(实际上这个类是一个单例,但我正在考虑把它变成一个静态类)

WindowManager类为系统中的每个窗口持有(私有)QSharedPointer,因此我可以轻松地从代码中的任何地方操作所有窗口。当我需要显示window X时,我只需调用WindowManager::showX(params),所有的检查和初始化都在该代码中进行。我也有WindowManager::minimizeX()这样的方法来处理一些逻辑,显示系统托盘消息,然后最小化窗口。

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


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

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

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

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