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

Posted

技术标签:

【中文标题】可以在 QtDesigner 的单个 .ui 文件中定义多个表单吗?【英文标题】:Possible to define multiple forms in a single .ui file in QtDesigner? 【发布时间】:2022-01-20 17:30:18 【问题描述】:

我见过Use a single source file for many QtDesigner forms,这也是我的问题的要点,但它只是建议:

我的建议是使用它作为 Qt 方式。为每个表单使用单独的类和单独的文件。这种方法更好。

但是,我想特别知道 - 是否有可能完全在单个 .ui 中定义多个表单(例如,“主窗口”和“底部按钮对话框”)文件,并在 QtDesigner 中使用它们?

基本上,对于我的一个应用程序,我使用 QtDesigner .ui 文件来设计 MainWindow,并从 Python (PyQt5) 加载它——效果很好。现在,我只想添加一个单击按钮时弹出的窗口对话框,并且我还想使用 QtDesigner,但我不想维护两个 .ui 文件。我想,一旦在 Python 中加载了这样一个 .ui 文件(具有多个表单定义),Python 代码只会将 QMainWindow 以外的所有表单设置为隐藏,然后在它们适当显示时进行管理。

(我使用 QtDesigner 开关,所以我不太了解它 - 但我记得有一些 QtDesigner 无法从 UI 中完成,但可以在 .ui 文件中手动完成,之后这样的变化,QtDesigner仍然可以处理它们.所以,如果有办法做到这一点 – 即使它在QtDesigner UI中不完全支持 – 我很想知道它,或者有一个明确的答案不可行)。

【问题讨论】:

链接的问题只讨论源文件(.cpp)和头文件(.h),而不是.ui i> 文件。因此,那里给出的建议与您的要求无关。 Qt Designer可能允许每个文件有多个表单 - 但它没有。所以你没有真正的选择,当然,就像 C++ 一样,你可以用最适合你的项目的任何方式组织你的 Python 模块。 【参考方案1】:

tl;博士

不,你不能。

为什么不呢?

UI 文件适用于单个窗口小部件(无论它们是否用作***窗口)及其可能的子窗口。

虽然我能理解您的要求,但它似乎与“项目”概念相关,而不是 UI 概念。这不是设计师的意图,设计师无法想象您项目的可能范围;即使是这样,也不是很实用:如果您的项目可能有数百个窗口怎么办?假设你有一个主窗口,打开你的程序,然后你决定关闭它:你的程序将加载数百个窗口,但没有使用它们,这会在程序加载中造成不必要的开销。

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

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

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

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

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

【讨论】:

谢谢——这正是我所需要的,一个明确的答案;所以我不会一直问自己同样的问题。另外,很好的解释!

以上是关于可以在 QtDesigner 的单个 .ui 文件中定义多个表单吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 qtDesigner .ui 文件链接到 python/pyqt?

在Qt中如何使用QtDesigner创建的UI文件

是否可以在 Qt Designer 中使用来自 Qt Designer 的 .ui 文件作为自定义小部件?

在Qt中如何使用QtDesigner创建的UI文件 (转)

从 .cpp 和 .h 为 Qt Designer 创建 ui 文件

vscode+PyQt+QtDesigner