一、概述
QSplitter允许用户通过拖动子部件之间的边界来控制子部件的大小。这个经常在我们使用的一些工具软件中最常使用
比如就像 QAssistant 里面的索引栏和内容直间,鼠标放在那个分界区,就会出一个图标,拖动那个栏,就可以移动左边的窗口大小。
还有就是比如说在 Qt Creator里面,也用了这个来调整大小。
二、使用说明
我们只需要单个QSplitter可以控制任意数量的 控件。
1. 添加子控件
QSplitter的典型用法是创建几个 控件并使用insertWidget()或addWidget()添加它们,没特殊指定位置就是在末尾添加新的控件。在QSplitter中已经有控件的话,我们可以用indexOf()、widget()和count()来访问QSplitter内的控件的位置、控件、个数等信息。
下面的例子将并排显示一个QListView, QTreeView和QTextEdit,因为有三个控件,就会有两个调整这些窗口的分隔栏:
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);
代码运行出来就是这个:
2. 内部控件大小和位置
默认的QSplitter水平布局子节点(并排),也就是上面图那种排布,你可以使用 setOrientation(Qt::Vertical) 在垂直方向上布局,就像下面:
默认情况下,所有 控件都可以根据用户的意愿大小,大小介于 控件的minimumSizeHint()(或minimumSize())和maximumSize()之间。
默认情况下,QSplitter动态调整子节点的大小,也即是鼠标按下拖动的时候,控件大小也随着变,如果希望QSplitter只在调整大小操作结束时调整子节点的大小,也即是鼠标按下拖动的时候不调整大小,释放鼠标之后,也即是调整结束后才调整大小,用setOpaqueResize(false) 来设置。
控件之间的初始大小分布由初始大小与拉伸因子相乘确定。还可以使用 setSizes() 来设置所有 控件的大小。函数 sizes() 返回用户设置的大小。或者,我们以分别使用 saveState() 和restoreState() 从QByteArray保存和恢复 之前控件的大小状态,等下一次启动的时候把这个状态再恢复就好啦。
当我们 hide() 一个子节点控件时,它的空间将被分配给其他的子节点。当我们 show() 它时,它将被恢复。
注意:添加一个QLayout到一个QSplitter是不支持的( 无论是通过setLayout()或使QSplitter的父QLayout):其实在QSplitter 里默认使用了类似 QBoxLayout 的布局,就是水平垂直布局的,使用addWidget() 来完成的。