在多个 ui 文件之间拆分 Qt 表单

Posted

技术标签:

【中文标题】在多个 ui 文件之间拆分 Qt 表单【英文标题】:Splitting Qt forms between multiple ui files 【发布时间】:2014-05-15 10:58:17 【问题描述】:

我在 Qt Designer 中创建了一个主窗口 UI 文件。为了避免混乱并使代码更加模块化,我想在单独的 ui 文件中创建此窗口的某些部分。

例如,我可能在主窗口上有一个选项卡小部件,然后我希望有单独的 page1.ui 和 page2.ui,然后我可以将它们“嵌入”到主窗口中。

是否可以仅使用 UI 文件,或者我是否需要为每个额外的小部件创建一个类?

我正在考虑创建单独的类 Page1UIPage2UI,它们公开继承自 qmake 生成的 ui_page1.hui_page2.h(以便可以从主窗口轻松访问其中的小部件),然后推广这些类的主窗口占位符小部件。所以在代码中我会有这样的东西,例如:

connect (page1->ui->someButtonFromPage1uiFile, ..., this->ui->someMainWindowWidget, ...);

但是 Qt documentation 似乎没有提到公共继承,所以我想知道这是否是正确的方法,或者是否有更简单的方法。

【问题讨论】:

您可以在您的用户界面中使用自定义 QWidget,方法是将标准 QWidget“提升”为您想要放置的类型, @ratchetfreak 我在问题中说过。我想知道是否a)我需要为每个UI文件创建一个单独的文件,或者我可以以某种方式将它们直接嵌入到彼此中; b) 公共继承是创建我的自定义小部件的好方法吗? 【参考方案1】:

您不需要继承。这些 UI 文件只是小部件。所以你当然可以这样做。您应该有一个主类,它将有一个选项卡小部件,然后只需在主选项卡小部件中添加您的 page1、page2 等。在我看来,你需要的是作文。

您需要做的是创建一个从QWidget 派生的单独类,该类将包含您生成的 UI 表单的对象。您需要在新类中调用该生成表单的setupUI(),并将this 作为参数。

【讨论】:

从技术上讲,我如何将主窗口的一个小部件提升到另一个 ui 小部件?假设我有一个form.ui,它生成ui_form.h。我尝试将一个小部件提升到 Ui_Form 类,但出现了几个错误,指出 Ui_Form 不是 QWidget @Marian 我在回答中添加了详细信息。 是的,这是有道理的。那么在我的 QWidget 派生类中,UI 表单应该是一个成员,还是应该通过公共或私有继承从它派生?请注意,如果我将其设为私有成员,我将无法直接从主窗口类访问它。 应该是会员。我看不出有任何私有继承的理由,它也降低了代码的可读性。为其添加访问器,以便您可以在主窗口中访问它。 Qt 文档本身建议私有继承,但感谢您为我指明了正确的方向。

以上是关于在多个 ui 文件之间拆分 Qt 表单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QT 中加载 UI 表单?

native="true" 在 Qt 设计器表单中代表啥

如何在 Qt5 中将表单类从 UI 转移到另一个文件夹

Qt Quick ui 表单不支持函数

Qt使用UI表单创建自定义小部件[关闭]

如何创建第二个 QT .ui 表单?