如何通过 qt 设计器创建 QSplitter ui 类?

Posted

技术标签:

【中文标题】如何通过 qt 设计器创建 QSplitter ui 类?【英文标题】:How to create QSplitter ui class via qt designer? 【发布时间】:2016-02-08 09:05:14 【问题描述】:

我是 Qt 新手,我需要实现一个监控接口,考虑以下几点:

    我有一个主窗口,我应该在其上放置多个屏幕,qsplitter 似乎是最好的解决方案。 该界面为用户提供了更改摄像头数量的选项,因此应在运行时创建/重新创建QSplitter

问题是我有太多相机无法为它们预先定义小部件,所以我需要动态创建QSplitter UI 实例。 问题是我在使用Qt Designer 时找不到QSplitter 类,并且以编程方式创建QSplitter 类不起作用,因为MainWindow 是通过Qt Designer (.ui) 创建的。 我想听听关于这个问题的任何建议,如果有更好的方法,请告诉我。

【问题讨论】:

【参考方案1】:

QSplitter 不是严格的 UI 元素,它本质上是控制子元素的父元素。如果你想通过 Designer 来做,你可能会很头疼,但基本要点是你选择一些要由它控制的小部件,然后单击布局按钮组中的 Layout Horizontally/Vertically in splitter 按钮。

您可能最好的做法是以编程方式创建子元素,以编程方式创建拆分器,使用someSplitter->addWidget(...) 添加子小部件。在 Qt 文档中有一些示例代码:

QSplitter *splitter = new QSplitter(parent);
QListView *listview = new QListView;
QTreeView *treeview = new QTreeView;
QTextEdit *textedit = new QTextEdit;
splitter->addWidget(listview);
splitter->addWidget(treeview);
splitter->addWidget(textedit);

http://doc.qt.io/qt-5/qsplitter.html#details

如果您真的想在 Designer 中执行此操作,这里有一个指南:http://www.bogotobogo.com/Qt/Qt5_Splitter.php

【讨论】:

【参考方案2】:

在 Qt Designer 中,QSplitter 不是小部件,而是Layout

选择要包含在两个分割区域中的小部件,然后从上下文菜单中选择 Layout(鼠标右键) - 您会发现两个条目 Layout Horizontally in splitterLayout Vertically in splitter 将小部件垂直分组或在水平拆分器中。

【讨论】:

【参考方案3】:

虽然 QSplitter 是一个小部件,但您不能直接在 Qt Designer 中创建一个。它仅可用于布置 预先存在的小部件 - 这不适合您的用例,因为您需要动态创建子小部件。

但是,您可以使用widget promotion 来解决此限制。这是一个简单的机制,允许您添加替代类来表示在 Qt Designer 中不直接可用的小部件。这个想法是您添加一个与您实际想要的最相似的小部件(例如,QFrameQSplitter 最相似),然后将其提升到您在自己的头文件中定义的替代类。当 uic 最终生成代码时,它将使用您的替代类而不是 Qt 设计器中添加的小部件类(它只是充当占位符)。

请注意,当您在“Promoted Widgets”对话框中创建替代类时,基类应该是QFrame,而不是QSplitter。这是因为您正在扩展 QFrame(即您的占位符小部件),而不是 QSplitter。当然,您可以将替代类定义为您喜欢的任何类型。

【讨论】:

【参考方案4】:

图片更容易理解。

【讨论】:

以上是关于如何通过 qt 设计器创建 QSplitter ui 类?的主要内容,如果未能解决你的问题,请参考以下文章

分割窗口QSplitter类

如何在 qt 设计器中将功能连接到 qt 小部件? - Python

Qt布局与分割器QSplitter

在当前文件中按下按钮后,如何打开另一个 qt 设计器文件?

QT QSplitter设置初始比例setStretchFactor失效解决

Qt - 如何覆盖小部件?