## 11.5 分裂器布局
QSplitter 实质上是一个窗口部件,但同时它可以包含一些其他窗口部件。在切分窗口(splitter)中的这些窗口部件会通过切分条(splitter handle)而分隔开来。用户可以 通过拖动这些切分条来改变切分窗口中子窗口部件的尺寸。切分窗口常常可以用作布局管理 器的替代,从而可以把更多的控制权交给用户。
### 11.5.1使用方法
大家知道,QSplitter 是一个容器类,Qt Designer 把分裂器对象视为可以容纳其它窗 口部件的布局。在 Qt Designer 中要使用分裂器布局也很容易,如图 11-27 所示,先选中 要布局的界面元素,然后选择工具栏上对应的按钮或者通过菜单项或者鼠标右键的上下文菜 单就可以完成。
![](https://box.kancloud.cn/2016-01-22_56a1a15975755.png)
图 11-27 使用分裂器布局
QSplitter 类可以用来创建分裂器布局,继而实现切分窗口。 创建一个分裂器布局的一般步骤如下:
第 1 步,创建要使用的窗口部件。
第 2 步,创建分裂器布局的实例,就是 QSplitter 的实例。
第 3 步,使用 insertWidget()或者 addWidget()方法把第 1 步创建的窗口部件加入到 布局之中。
第 4 步,调用 QWidget::setLayou()方法把布局安装到窗体上。 注意,在使用分裂器布局之前,需要包含它的头文件声明:
```
#include <QSplitter>
```
### 11.5.2 构造函数
QSplitter 类有两个构造函数的原型:
```
QSplitter::QSplitter ( Qt::Orientation orientation, QWidget * parent = 0 )
```
参数 orientation 指定了分裂器的方向是水平的还是垂直的, parent 指定了父窗口。一 个使用该型构造函数的代码示例如下:
```
QSplitter *splitterRight = new QSplitter(Qt::Vertical,splitterMain);
```
该代码定义了一个垂直分裂器布局,并指定了它的父窗口为 splitterMain,后者也是一个分裂器布局。
```
QSplitter::QSplitter ( QWidget * parent = 0 )
```
这个型别实质上是第一种构造函数的缺省变体,它默认创建一个水平的分裂器布局。 一个使用该型构造函数的代码示例如下:
```
QSplitter splitter(0);
```
该代码定义了一个水平分裂器布局,并且采用程序上下文中的窗口作为父窗口。
这两种构造函数型我们都会经常用到,请读者朋友注意掌握。
### 11.5.3 一些深入的话题
默认情况下,在分裂器布局中的窗口部件会尽可能的按照用户的意愿在它的最小大小 提示以及最小大小或者是最大大小之间调整。如果有需要,也可以调用 QSplitter 类的 setSizes()方法来为布局中每个窗口部件指定大小。而要获取分裂器布局内当前的各个窗口 部件的大小,可以使用 QSplitter 类的 sizes()方法。
如果你想保存分裂器布局的构造,可以使用 QSplitter 的 saveState()和 restoreState()方法。它们通常与 QSettings 类结合使用,保存设置的代码如下:
```
QSettings settings;
settings.setValue("splitterSizes", splitter->saveState());
```
恢复设置的代码如下:
```
QSettings settings;
splitter->restoreState(settings.value("splitterSizes").toByteArray());
```
同前面讲过的堆栈布局的情形类似,如果你想获取分裂器布局中的窗口部件的相关信息,可以通过调用 indexof()、widget()以及 count()等方法来实现。
当你调用 hide()方法隐藏了分裂器布局中的某个窗口部件时,它会在界面上消失掉, 并且它原先占有的空间将被其它的窗口部件所 “分享”。而一旦你调用 show()方法显示它 时,一切又会恢复原样。
分裂器布局也是经常使用的一种,它分为分裂器水平布局和分裂器垂直布局,这可以 通过设置分裂器布局的方向来确定,如 Qt::Horizontal 和 Qt::Vertical。使用它们时,界 面效果和使用常见的水平和垂直布局几乎没有区别,它的最明显特征是布局内的元素之间是 等间距的,而水平和垂直布局则不一定是这样。
### 11.5.4 分裂器布局实例
在 QSplitter 中的子窗口部件将会自动按照创建时的顺序一个挨一个的(或者一个在 另外一个的下面)放在一起,并以切分窗口拖动条( splitter bar)来分隔相邻的窗口部 件。以下是用于创建如图 11-28 所示的分裂器水平布局的窗口的代码。完整的源代码见实 例 splitter。
```
#include <QtGui>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QListWidget *listWidget = new QListWidget;
QTreeWidget *treeWidget = new QTreeWidget;
QTextEdit *editor = new QTextEdit;
QSplitter splitter(Qt::Horizontal);
splitter.addWidget(listWidget);
splitter.addWidget(treeWidget);
splitter.addWidget(editor);
listWidget->addItem(QObject::tr("Inbox"));
listWidget->addItem(QObject::tr("Outbox"));
listWidget->addItem(QObject::tr("Sent"));
listWidget->addItem(QObject::tr("Trash"));
treeWidget->setColumnCount(1);
QList<QTreeWidgetItem *> items;
for (int i = 0; i < 10; ++i)
items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item:%1").arg(i))));
treeWidget->insertTopLevelItems(0, items);
editor->setPlainText(QObject::tr("My child, my sister,\n"
"think of the sweetness\n"
"of going there to live together!\n"
"To love at leisure,\n"
"to love and to die\n"
"in a country that is the image of you!"));
splitter.setWindowTitle(QObject::tr("Splitter"));
splitter.show();
return app.exec();
}
```
把这段代码保存成一个.cpp 文件,如 splitter.cpp,并创建一个文件夹 splitter,把splitter.cpp 文件放入其中。依次运行 qmake –project,qmake splitter.pro,mingw32- make,即可生成可执行文件。程序的运行效果如图 11-28 所示。
![](https://box.kancloud.cn/2016-01-22_56a1a159a06b0.png)
图 11-28 分裂器布局实例效果
该程序代码比较易懂,我们简要的讲解一下。
第 1 行,加入了程序中用到的头文件声明,这也包括了 QSplitter 类的声明在里面。 第 5-7 行定义了布局内用到的窗口部件。
第 8 行定义了一个分裂器水平布局。
第 9-11 行将窗口部件加入到分裂器布局之中。
第 12-15 行为 listWidget 添加一些项目。注意在这个程序中,由于 main()主函数并不 是属于某个 QObject 类的子类,所以不能直接使用 tr()函数,而需要静态调用它,即 QObject::tr()。
第 16 行设置 treeWidget 的列数为 1。 第 17 行声明一个链表对象 items。
第 18-19 行为 items 赋值。
第 20 行将 items 的值加入到 treeWidget 中。 第 21 行为 editor 设置文本。
第 22 行设置窗口标题。
第 23-24 行显示窗体。
- 第 1 章 走近 Qt
- 1.1 Qt 简介
- 1.2 Qt 纪事概览
- 1.3 Qt 套件的组成(以 Qt4.5 为准)
- 1.4 Qt 的授权
- 1.5 Qt 的产品
- 1.6 Qt 的服务与支持
- 1.7 Qt 的最新进展
- 1.8为什么选择 Qt
- 1.9 问题与解答
- 1.10 总结与提高
- 第 2 章 Qt 的安装与配置
- 2.1 获取 Qt
- 2.2 协议说明
- 2.3 安装 Qt
- 2.4 配置 Qt4 环境
- 2.5 问题与解答
- 2.6 总结与提高
- 第 3 章 Qt 编程基础
- 3.1 标准 C++精讲
- 3.2 Windows 编程基础
- 3.3 Linux 编程基础
- 3.4 Mac 编程基础
- 3.5 问题与解答
- 3.6 总结与提高
- 第 4 章 Qt 4 集成开发环境
- 4.1 常见的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 问题与解答
- 4.6 总结与提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 进行 GUI 设计
- 5.2 使用 Qt Assistant 获取在线文档与帮助
- 5.3 使用 Qt Demo 学习 Qt 应用程序开发
- 5.4 问题与解答
- 5.5 总结与提高
- 第 6 章 Qt 4 程序开发方法和流程
- 6.1 开发方法
- 6.2 Hello Qt
- 6.3 几个重要的知识点
- 6.4 问题与解答
- 6.5 总结与提高
- 第 7 章 对话框
- 7.1 QDialog 类
- 7.2 子类化 QDialog
- 7.3 快速设计对话框
- 7.4 常见内建(built in)对话框的使用
- 7.5 模态对话框与非模态对话框
- 7.6 问题与解答
- 7.7 总结与提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 创建主窗口的方法和流程
- 8.3 代码创建主窗口
- 8.4 使用 Qt Designer 创建主窗口
- 8.5 中心窗口部件专题
- 8.6 Qt4 资源系统专题
- 8.7 锚接窗口
- 8.8 多文档
- 8.9 问题与解答
- 8.10 总结与提高
- 第 9 章 Qt 样式表与应用程序观感
- 9.1 应用程序的观感
- 9.2 QStyle 类的使用
- 9.3 样式表概述
- 9.4 使用样式表
- 9.5 问题与解答
- 9.6 总结与提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的组成
- 10.3 编译时加入处理.ui 文件的方法
- 10.4 运行时加入处理.ui 文件的方法
- 10.5 信号与槽的自动连接
- 10.6 问题与解答
- 10.7 总结与提高 本章主要讲解了以下内容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局实践
- 11.4 堆栈布局
- 11.5 分裂器布局
- 11.6 自定义布局管理器
- 11.7 布局管理经验总结
- 11.8 问题与解答
- 11.9 总结与提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概览
- 12.2 Qt Creator 的组成
- 12.3 快捷键和常用技巧
- 12.4 Qt Creator 构建系统的设置
- 12.5 处理项目间依赖关系( Dependencies )
- 12.6 Qt 多版本共存时的管理
- 12.7 使用定位器在代码间快速导航
- 12.8 如何创建一个项目
- 12.9 实例讲解
- 12.10 使用 Qt Creator 调试程序
- 12.11 问题与解答
- 12.12 总结与提高
- 第 13 章 Qt 核心机制与原理
- 13.1 Qt 对标准 C++的扩展
- 13.2 信号与槽
- 13.3 元对象系统
- 13.4 Qt 的架构
- 13.5 Qt 的事件模型
- 13.6 构建 Qt 应用程序
- 13.7 总结与提高
- 附录 A qmake 使用指南
- A.1 qmake 简介
- A.2 使用 qmake
- 附录 B make 命令
- B.1 命令解释
- B.2 使用 make 自动构建
- 附录 C Qt 资源
- C.1Qt 官方资源
- C.2 Qt 开发社区