Qt分裂器
Qt分裂器(QSplitter)用于在窗口中创建可调整大小的多个子控件区域,支持水平或垂直分割,便于动态布局管理。
Qt分裂器
Qt 分裂器
QSplitter
QSplitter
是 Qt 框架中提供的一种布局管理控件,属于 QtWidgets
模块,用于在界面中分隔多个子控件并支持用户拖动调整它们大小,常用于需要可调节区域大小的应用,比如文件管理器、IDE 或面板式软件界面。
常用方法/属性
方法 / 属性 | 功能描述 |
---|---|
addWidget(QWidget *widget) | 向分隔器中添加一个子控件。 |
insertWidget(int index, QWidget *widget) | 在指定位置插入一个子控件。 |
widget(int index) | 返回指定索引处的子控件。 |
count() | 返回子控件的数量。 |
indexOf(QWidget *widget) | 返回指定控件在 splitter 中的索引。 |
setOrientation(Qt::Orientation) | 设置分隔方向:Qt::Horizontal 或 Qt::Vertical 。 |
orientation() | 返回当前的分隔方向。 |
setSizes(const QList<int> &sizes) | 设置所有子控件的初始尺寸(像素单位)。 |
sizes() | 获取当前所有子控件的尺寸列表。 |
setStretchFactor(int index, int stretch) | 设置某个子控件的拉伸因子(决定空间分配比例)。 |
setCollapsible(int index, bool) | 设置某个子控件是否可以被完全收起。 |
setChildrenCollapsible(bool) | 设置所有子控件是否可以被收起(默认 true)。 |
isCollapsible(int index) | 返回某个子控件是否可折叠。 |
handle(int index) | 返回指定索引处的分隔条句柄(QSplitterHandle* ),可用于自定义样式或行为。 |
saveState() const | 保存当前 splitter 的状态(子控件尺寸、顺序等),返回 QByteArray 。 |
restoreState(const QByteArray &state) | 恢复之前保存的 splitter 状态。 |
opaqueResize() | 是否启用实时调整尺寸(默认 true,即拖动时立即生效)。 |
setOpaqueResize(bool opaque) | 设置是否启用实时调整尺寸(关闭后拖动只显示拖动线,释放后才更新)。 |
childrenCollapsible() | 返回当前是否允许所有子控件可收起。 |
handleWidth() | 获取分隔条的宽度(默认 5 像素)。 |
setHandleWidth(int width) | 设置分隔条宽度。 |
refresh() | 重新布局所有子控件(不常用)。 |
minimumSizeHint() | 返回推荐的最小尺寸。 |
基本用法示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
// 创建一个垂直分割器
QSplitter *splitter = new QSplitter(Qt::Vertical);
// 添加两个 QTextEdit 控件
splitter->addWidget(new QTextEdit("Top Widget"));
splitter->addWidget(new QTextEdit("Bottom Widget"));
// 设置主布局
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(splitter);
window.setLayout(layout);
window.resize(400, 300);
window.show();
return app.exec();
}
自定义样式
可以通过 QSplitterHandle
自定义分隔条样式,比如宽度、颜色等。也可结合 QSS 进行样式定制。
1
splitter->setStyleSheet("QSplitter::handle { background-color: gray }");
保存和恢复尺寸状态(Persistent State)
QSplitter
内置了两个非常重要的方法:
QByteArray QSplitter::saveState() const
获取当前分隔器的所有状态(包括子控件尺寸、顺序等),返回一个QByteArray
。bool QSplitter::restoreState(const QByteArray &state)
恢复之前保存的状态,返回值表示是否成功。
示例:保存状态到 QSettings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>
#include <QSettings>
#include <QVBoxLayout>
#include <QWidget>
class MyWindow : public QWidget {
QSplitter *splitter;
public:
MyWindow() {
splitter = new QSplitter(Qt::Horizontal);
splitter->addWidget(new QTextEdit("Left Panel"));
splitter->addWidget(new QTextEdit("Right Panel"));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(splitter);
setLayout(layout);
// 从 QSettings 恢复状态
QSettings settings("MyCompany", "MyApp");
splitter->restoreState(settings.value("splitterState").toByteArray());
}
~MyWindow() {
// 应用关闭时保存状态
QSettings settings("MyCompany", "MyApp");
settings.setValue("splitterState", splitter->saveState());
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyWindow w;
w.resize(600, 400);
w.show();
return app.exec();
}
QSettings
QSettings
是 Qt 提供的一个非常实用的类,用于跨平台地保存和读取应用程序的配置数据(比如窗口大小、用户偏好设置、上次打开的文件路径、界面状态等)。它支持将数据持久化到系统注册表、INI 文件、或 macOS 的 plist 文件中,而无需开发者手动处理文件读写。
核心特性
- 自动持久化:程序关闭时不需要手动保存,
QSettings
的写入是立即生效的。 - 跨平台兼容:Windows 下默认写入注册表,Linux/macOS 下写入
.ini
或系统标准配置路径。 - 层级结构:支持用“路径”的方式组织键值(如
window/size
)。 - 支持多种数据类型:字符串、整数、布尔值、QVariant、QByteArray、QSize、QPoint 等。
基本用法
写入配置
1
2
3
4
5
6
7
8
#include <QSettings>
QSettings settings("MyCompany", "MyApp");
// 写入键值对
settings.setValue("window/size", QSize(800, 600));
settings.setValue("window/pos", QPoint(100, 100));
settings.setValue("user/rememberMe", true);
读取配置
1
2
3
QSize size = settings.value("window/size", QSize(400, 300)).toSize();
QPoint pos = settings.value("window/pos", QPoint(50, 50)).toPoint();
bool rememberMe = settings.value("user/rememberMe", false).toBool();
构造函数形式
1
QSettings settings("OrganizationName", "ApplicationName"); // 推荐写法
也可以手动指定 .ini
文件路径:
1
QSettings settings("config.ini", QSettings::IniFormat);
默认存储路径(按平台)
平台 | 默认存储位置 |
---|---|
Windows | 注册表 HKEY_CURRENT_USER\Software\MyCompany\MyApp |
Linux | ~/.config/MyCompany/MyApp.conf (或 .ini 文件) |
macOS | ~/Library/Preferences/com.MyCompany.MyApp.plist |
若用 IniFormat
,会始终使用本地 .ini
文件,不走平台默认方式。
实用方法
方法 / 属性 | 说明 |
---|---|
setValue(key, value) | 设置键值 |
value(key, defaultValue) | 读取值,若不存在则返回默认值 |
contains(key) | 检查是否存在某个键 |
remove(key) | 删除某个键 |
clear() | 清空所有设置项 |
beginGroup("group") / endGroup() | 设置/退出分组(用于逻辑归类) |
childKeys() | 获取当前组下所有键 |
childGroups() | 获取当前组下所有子组 |
sync() | 强制将缓存中的设置写入磁盘 |
高级用法示例:使用分组
1
2
3
4
settings.beginGroup("MainWindow");
settings.setValue("size", QSize(800, 600));
settings.setValue("pos", QPoint(100, 100));
settings.endGroup();
读取时也一样:
1
2
3
4
settings.beginGroup("MainWindow");
QSize size = settings.value("size").toSize();
QPoint pos = settings.value("pos").toPoint();
settings.endGroup();
使用分裂器排布简易 HTML 查看器
widget.ui
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>630</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0">
<item>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
<string notr="true">QSplitter::handle {
background-color: rgb(0, 255, 127);
}</string>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<widget class="QTextBrowser" name="textBrowser"/>
<widget class="QPlainTextEdit" name="plainTextEdit"/>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="btnBackward">
<property name="text">
<string>后退</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnForward">
<property name="text">
<string>前进</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnOpen">
<property name="text">
<string>打开HTML</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
widget.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget* parent = nullptr);
~Widget();
private slots:
void on_btnOpen_clicked();
void on_textBrowser_backwardAvailable(bool arg1);
void on_textBrowser_forwardAvailable(bool arg1);
void on_textBrowser_textChanged();
private:
Ui::Widget* ui;
void saveSettings();
void loadSettings();
// QWidget interface
protected:
void closeEvent(QCloseEvent* event) override;
};
#endif // WIDGET_H
widget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "widget.h"
#include <QFileDialog>
#include <QSettings>
#include <QUrl>
#include "./ui_widget.h"
// 构造函数:初始化 UI 组件并连接信号与槽函数
Widget::Widget(QWidget* parent) : QWidget(parent), ui(new Ui::Widget) {
ui->setupUi(this); // 设置 UI
ui->plainTextEdit->setReadOnly(true); // 设置 plainTextEdit 为只读,用于显示 HTML 源码
ui->textBrowser->setOpenExternalLinks(true); // 启用超链接的外部打开功能(在浏览器中打开)
ui->btnBackward->setEnabled(false); // 初始化时“后退”按钮禁用
ui->btnForward->setEnabled(false); // 初始化时“前进”按钮禁用
// 连接按钮点击信号与 QTextBrowser 的后退/前进槽函数
connect(ui->btnBackward, &QPushButton::clicked, ui->textBrowser, &QTextBrowser::backward);
connect(ui->btnForward, &QPushButton::clicked, ui->textBrowser, &QTextBrowser::forward);
loadSettings();
}
// 析构函数:释放 UI 资源
Widget::~Widget() {
delete ui;
}
// 打开按钮点击事件:选择 HTML 文件并加载到 QTextBrowser 中
void Widget::on_btnOpen_clicked() {
// 使用 QFileDialog 打开一个文件选择对话框,获取用户选择的 HTML 文件的 URL
// 参数说明:
// 1. this:父窗口指针,指定这个对话框的父对象为当前
// Widget,确保对话框在当前窗口之上弹出
// 2. "open HTML":对话框标题,用于提示用户当前操作是“打开 HTML 文件”
// 3. QUrl():初始路径,传入空 QUrl 表示使用默认目录(可用
// QUrl::fromLocalFile("路径") 指定初始目录)
// 4. "HTML files(*.htm *.html)":过滤器字符串,仅显示 *.htm 和 *.html
// 后缀的文件
QUrl urlFile = QFileDialog::getOpenFileUrl(this, "open HTML", QUrl(), "HTML files(*.htm *.html)");
// 判断用户是否实际选择了文件(即返回的 URL 非空)
if (!urlFile.isEmpty()) {
qDebug() << urlFile; // 输出选择的文件 URL,用于调试
ui->textBrowser->setSource(urlFile); // 将选择的 HTML 文件加载到 QTextBrowser 中显示
}
}
// 当 textBrowser 可以后退时,启用“后退”按钮
void Widget::on_textBrowser_backwardAvailable(bool arg1) {
ui->btnBackward->setEnabled(arg1);
}
// 当 textBrowser 可以前进时,启用“前进”按钮
void Widget::on_textBrowser_forwardAvailable(bool arg1) {
ui->btnForward->setEnabled(arg1);
}
// 当 textBrowser 内容变化时,更新 plainTextEdit 显示 HTML 源码
void Widget::on_textBrowser_textChanged() {
QString strHtml = ui->textBrowser->toHtml(); // 获取 HTML 内容
ui->plainTextEdit->setPlainText(strHtml); // 显示在 plainTextEdit 中
}
// 当窗口关闭时触发的事件处理函数
void Widget::closeEvent(QCloseEvent* event) {
// 保存当前窗口及控件的状态到设置文件
saveSettings();
}
// 保存窗口及控件状态到配置文件
void Widget::saveSettings() {
// 创建 QSettings 对象,参数是组织名和应用名,数据存储路径与注册表或配置文件相关
QSettings settings("QtGuide", "SimpleBrowser");
// 保存主窗口的几何信息(位置和大小)
QByteArray baMainWidget = this->saveGeometry();
// 保存分割器(splitter)的状态(布局信息)
QByteArray baSplitter = ui->splitter->saveState();
// 获取当前文本浏览器的 URL 来源
QUrl urlSrc = ui->textBrowser->source();
// 将以上信息写入配置文件或注册表
settings.setValue("MainWidget", baMainWidget);
settings.setValue("Splitter", baSplitter);
settings.setValue("URL", urlSrc);
}
// 读取配置文件,恢复窗口和控件的状态
void Widget::loadSettings() {
// 创建 QSettings 对象,路径和保存时相同
QSettings settings("QtGuide", "SimpleBrowser");
// 如果存在保存的主窗口几何信息,则恢复窗口位置和大小
if (settings.contains("MainWidget")) {
QByteArray baMainWidget = settings.value("MainWidget").toByteArray();
this->restoreGeometry(baMainWidget);
}
// 如果存在保存的分割器状态,则恢复布局
if (settings.contains("Splitter")) {
QByteArray baSplitter = settings.value("Splitter").toByteArray();
ui->splitter->restoreState(baSplitter);
}
// 如果存在保存的 URL,则设置文本浏览器显示该 URL
if (settings.contains("URL")) {
QUrl urlSrc = settings.value("URL").toUrl();
ui->textBrowser->setSource(urlSrc);
}
}
分裂器内间接添加布局器的示例
widget.ui
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QSplitter" name="splitter_2">
<property name="styleSheet">
<string notr="true">QSplitter::handle {
background-color: rgb(0, 255, 127);
}</string>
</property>
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<widget class="QSplitter" name="splitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>4</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">QSplitter::handle {
background-color: rgb(0, 255, 127);
}</string>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<widget class="QTextEdit" name="textEdit">
<property name="html">
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: "\2610"; }
li.checked::marker { content: "\2612"; }
</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">编辑器</p></body></html></string>
</property>
</widget>
<widget class="QWidget" name="">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>功能1</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>功能2</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>功能3</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QTextBrowser" name="textBrowser">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="html">
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: "\2610"; }
li.checked::marker { content: "\2612"; }
</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">提示信息</p></body></html></string>
</property>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
ui_widget.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 6.9.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_WIDGET_H
#define UI_WIDGET_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QTextBrowser>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Widget
{
public:
QVBoxLayout *verticalLayout_2; // 最外层垂直布局,管理整个窗口的控件排布
QSplitter *splitter_2; // 垂直分割器,垂直分割两个区域
QSplitter *splitter; // 水平分割器,水平分割文本编辑区和按钮区
QTextEdit *textEdit; // 文本编辑控件,位于 splitter 左侧
QWidget *widget; // splitter 右侧的容器 widget,用于承载按钮的布局
QVBoxLayout *verticalLayout; // widget 中的垂直布局,排列多个按钮
QPushButton *pushButton; // 按钮1
QPushButton *pushButton_2; // 按钮2
QPushButton *pushButton_3; // 按钮3
QTextBrowser *textBrowser; // 文本浏览控件,位于 splitter_2 的下方区域
void setupUi(QWidget *Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName("Widget");
Widget->resize(600, 480);
// 创建最外层垂直布局,放入 splitter_2
verticalLayout_2 = new QVBoxLayout(Widget);
verticalLayout_2->setObjectName("verticalLayout_2");
// 创建垂直方向的分割器 splitter_2,分割上半部分(splitter)和下半部分(textBrowser)
splitter_2 = new QSplitter(Widget);
splitter_2->setObjectName("splitter_2");
splitter_2->setStyleSheet(QString::fromUtf8("QSplitter::handle { \n"
" background-color: rgb(0, 255, 127);\n"
"}"));
splitter_2->setOrientation(Qt::Orientation::Vertical);
// 创建水平方向的分割器 splitter,分割左边的文本编辑和右边按钮区域
splitter = new QSplitter(splitter_2);
splitter->setObjectName("splitter");
QSizePolicy sizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(4);
sizePolicy.setHeightForWidth(splitter->sizePolicy().hasHeightForWidth());
splitter->setSizePolicy(sizePolicy);
splitter->setStyleSheet(QString::fromUtf8("QSplitter::handle { \n"
" background-color: rgb(0, 255, 127);\n"
"}"));
splitter->setOrientation(Qt::Orientation::Horizontal);
// 创建文本编辑控件,添加到 splitter 左侧
textEdit = new QTextEdit(splitter);
textEdit->setObjectName("textEdit");
// 创建一个 QWidget(container widget),用来包裹按钮布局
// 注意:QSplitter 只能直接放置 QWidget 类型的控件,
// 不能直接放布局,所以这里创建一个空的 QWidget 作为容器
widget = new QWidget(splitter);
widget->setObjectName("widget");
// 在 widget 中创建垂直布局,用于排列按钮
verticalLayout = new QVBoxLayout(widget);
verticalLayout->setObjectName("verticalLayout");
verticalLayout->setContentsMargins(0, 0, 0, 0); // 去除边距,使按钮紧凑排列
// 创建三个按钮,并添加到 widget 的垂直布局中
pushButton = new QPushButton(widget);
pushButton->setObjectName("pushButton");
verticalLayout->addWidget(pushButton);
pushButton_2 = new QPushButton(widget);
pushButton_2->setObjectName("pushButton_2");
verticalLayout->addWidget(pushButton_2);
pushButton_3 = new QPushButton(widget);
pushButton_3->setObjectName("pushButton_3");
verticalLayout->addWidget(pushButton_3);
// 把包裹按钮的 widget 加入 splitter 的右侧
splitter->addWidget(widget);
// 把 splitter(包含左侧文本编辑和右侧按钮区域)加入 splitter_2 的上部
splitter_2->addWidget(splitter);
// 创建文本浏览控件,放入 splitter_2 的下方
textBrowser = new QTextBrowser(splitter_2);
textBrowser->setObjectName("textBrowser");
QSizePolicy sizePolicy1(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(1);
sizePolicy1.setHeightForWidth(textBrowser->sizePolicy().hasHeightForWidth());
textBrowser->setSizePolicy(sizePolicy1);
// 添加文本浏览控件到底部分割器 splitter_2 中
splitter_2->addWidget(textBrowser);
// 把 splitter_2 添加到最外层的垂直布局中
verticalLayout_2->addWidget(splitter_2);
retranslateUi(Widget);
QMetaObject::connectSlotsByName(Widget);
} // setupUi
void retranslateUi(QWidget *Widget)
{
Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));
textEdit->setHtml(QCoreApplication::translate("Widget", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">\347\274\226\350\276\221\345\231\250</p></body></html>", nullptr));
pushButton->setText(QCoreApplication::translate("Widget", "\345\212\237\350\203\2751", nullptr));
pushButton_2->setText(QCoreApplication::translate("Widget", "\345\212\237\350\203\2752", nullptr));
pushButton_3->setText(QCoreApplication::translate("Widget", "\345\212\237\350\203\2753", nullptr));
textBrowser->setHtml(QCoreApplication::translate("Widget", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">\346\217\220\347\244\272\344\277\241\346\201\257</p></body></html>", nullptr));
} // retranslateUi
};
namespace Ui {
class Widget: public Ui_Widget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_WIDGET_H
QSplitter
只能直接放置QWidget
,而不能直接放置布局,所以自动生成的代码中会创建一个空的QWidget
作为容器,再给这个QWidget
添加布局。水平
splitter
左边是QTextEdit
,右边是一个包裹了垂直布局的QWidget
,布局中放了3个按钮。垂直
splitter_2
上半部分是上述水平splitter
,下半部分是QTextBrowser
。
本文由作者按照 CC BY 4.0 进行授权