可以在 QtDesigner 中的单个 .ui 文件中定义多个表单吗?

Possible to define multiple forms in a single .ui file in QtDesigner?

我已经看到 Use a single source file for many QtDesigner forms,这也是我的问题的要点,- 但它只是建议:

My advice is to use it as Qt way. Use seperate classes and seperate files for each form. This approach is better.

但是,我想具体知道 - 是否有可能 完全 定义多个表单(例如,“Main Window”和“Dialog with Buttons Bottom") 在单个 .ui 文件中,并在 QtDesigner 中使用它们?

基本上,对于我的应用程序,我使用 QtDesigner .ui 文件来设计 MainWindow,并从 Python (PyQt5) 加载它 - 它工作得很好.现在,我只想添加一个单击按钮时出现的 window 对话框,我也想为此使用 QtDesigner,但我不想维护两个 .ui 文件。我想,一旦这样的 .ui 文件(具有多个表单定义)将被加载到 Python 中,Python 代码将只设置除 QMain[=33= 之外的所有表单] 隐藏,然后在适当显示时进行管理。

(我断断续续地使用 QtDesigner,所以我不太了解它 - 但是我记得有一些 QtDesigner 无法从 UI 做到的事情,但可以在.ui 文件,经过这样的更改,QtDesigner 仍然可以处理它们。所以,如果有办法做到这一点 - 即使 QtDesigner UI 不完全支持它 - 我会很想知道它,或者有一个明确的答案,它是不可行的)。

tl;博士

不,你不能。

为什么不呢?

UI 文件用于单个小部件(它们是否作为顶级 windows 并不重要)及其可能的子部件。

虽然我能理解您的要求,但与 UI 相比,它似乎与“项目”概念更相关。这不是 Designer 的意图,它无法想象您的项目的可能范围;即使是这样,也不太实用:如果您的项目可能有数百个 windows 怎么办?假设您有一个主 window,打开您的程序,但随后您决定关闭它:您的程序将加载数百个 windows,但使用其中的 none,导致不必要的程序加载的开销。

这个概念类似于OOP的模块化:你不仅要“加载”你实际需要的东西,而且你还应该将项目“拆分”在不同的文件中(模块,与 python 模块不同)以实现更好的维护、可重用性和概览。如果您出于某种原因想要拥有两个单独的“主”UI 文件,并且碰巧它们使用类似的对话框怎么办?您应该每次都复制该对话框,如果在某个时候您忘记了该步骤,您甚至可能会导致您的程序崩溃,因为它正在尝试访问不存在或只是稍微重命名的对象。

此外,某些接口可能非常复杂,在启动时自动加载它们是没有意义的:如果您使用 uic 模块,则需要对 进行不必要的解析UI 的整个 xml 树,这将是 每次 来自该文件的 window 的新实例是必需的。

也许有一天,Qt 的开发人员会决定在 Designer 中允许“项目”(这可能是 Qt Creator 所做的,但我从未使用过),但 ui 文件仍然是独立的,他们应该这样做。

所以,不用太担心,这更多是习惯问题和稍微烦人的方面:如果您的项目构思良好,并且文件命名正确,则不会是主要问题并且它无论如何都会有它的好处(即使你没有尽可能地考虑它们)。

PS:是的,UI个文件是XML个文件,可以编辑;您甚至可以 create/edit 一个 UI 文件并执行 Designer 无法执行的操作。但这只是一个“意想不到的功能”(或 smart hack),您可以 never 始终确定结果。在未来(或只是不同)版本中,解析器可能[变得]更严格,结果是你的UI变得完全无法使用。这与编辑 pyuic 文件没有什么不同:使用它们的程序期望 已知 行为(Designer 的 XML 输出),以及普遍接受的用法。正如最近的 pyuic 文件头(我想标记一下,是根据我的个人建议添加的)报告:“除非你知道自己在做什么,否则不要编辑此文件”;-)