QSplitter是一个可以包含一些其他窗口部件的窗口部件。
在切分窗口(splitter)中的这些窗口部件会通过切分条(splitter handle)而分割开来。用户通过拖动这些切分条来改变切分窗口中子窗口部件的大小。
切分窗口常常可以用作布局管理器的替代品,从而可以把更多的控制权交给用户。
QSplitter中的子窗口部件会自动按照创建时的顺序一个挨一个放在一起,并以切分窗口拖动条来分割相邻窗口部件。如:
//创建3个QTextEdit QTextEdit* editor1 = new QTextEdit(this);
QTextEdit* editor2 = new QTextEdit(this);
QTextEdit* editor3 = new QTextEdit(this);
QSplitter splitter(Qt::Horizontal); // 水平切分
// 水平切分窗口添加QTextEdit控件
splitter.addWidget(editor1);
splitter.addWidget(editor2);
splitter.addWidget(editor3);
布局管理器不同之处:布局管理器只是简单的摆放一个窗体中的子窗口部件并且也没有可见的外形,而QSplitter是从QWidget派生的,并且在使用的时候,它也可以像其他窗口部件一样使用。
QSplitter同样可以嵌套使用,如:
// 右侧切分窗口所需的控件 QTableWidget* pMessagesTableWidget = new QTableWidget;
QTextEdit* pTextEdit = new QTextEdit;
// 右侧切分窗口
QSplitter* pRightSplitter = new QSplitter(Qt::Vertical);
// 右侧切分窗口添加控件,按照顺序逐个添加
pRightSplitter->addWidget(pMessagesTableWidget);
pRightSplitter->addWidget(pTextEdit);
// 设置控件的缩放因子
pRightSplitter->setStretchFactor(1, 1);
// 主切分窗口左侧所需的控件
QTreeWidget* pFoldersTreeWidget = new QTreeWidget;
// 主切分窗口
QSplitter* pMainSplitter = new QSplitter(Qt::Horizontal);
// 主切分窗口添加控件
pMainSplitter->addWidget(pFoldersTreeWidget);
pMainSplitter->addWidget(pRightSplitter);
// 设置控件的缩放因子
pMainSplitter->setStretchFactor(1, 1);
// 设置中心窗口
setCentralWidget(pMainSplitter);
这里着重说一下函数setStretchFactor的用法
当用户重新改变窗口的大小时,QSplitter通常会重新分配空间,以便能够使所有的子窗口部件的相对大小能够与先前一样保持相同的比例。当不需要这样的效果时,则使用函数setStretchFactor来实现。第一个参数是切分窗口子窗口部件的索引值,该值是一个从0开始的整数值;第二个参数是想要设置的伸展因子,伸展因子默认值是0.
上述例子中,第一次是对pRightSplitter调用,会把位置1处的窗口部件(pTextEdit)的伸展因子设置为1。第二次是对pMainSplitter调用,会把位置1处的窗口部件(pRightSplitter)的伸展因子设置为1。当窗口大小发生变化时,pTextEdit总是可以获得那些多余的可用空间。
在启动应用程序时,QSplitter会根据子窗口部件的初始大小(或者在没有给定初始大小的时候,根据它们的大小提示)给它们分配合适的大小。
在程序中,可以通过QSplitter::setSize()来移动切分条。
QSplitter类也可以保存它的状态,并且可以在下次运行应用程序的使用直接恢复它的状态值。
参考《C++ CUI Qt4编程 (第二版)》