有时布局中的子控件不能完全显示,或者我们希望子控件能暂时占据更多的显示空间,然后我们需要使用另一个布局管理分割器。
当鼠标移动到子控件之间的间隔线时,鼠标会变成以下形状
3.3.1 QSplitter
1 childrenCollapsible 子控件能否折叠?
2 handleWidth 分割线宽度。
3 opaqueResize 是否立即改变大小。
true-默认情况下,当拖动分割线时,控件随分割线启动。false-拖动分割线时,只有分割线移动,松开鼠标后,控制器才能改变大小。
4 orientation 分割器方向,水平或垂直。
3.3.2 常用函数
3.3.2.1 saveState()和restoreState()
保持当前状态和恢复以前状态。当我们使用分割器时,许多控制器的大小会发生变化,当我们想要恢复一定状态时,我们可以使用这两个函数。
当您开发的软件再次打开时,如果您想恢复到最后一个布局图片,您也可以使用这两个函数。我将在下面的例子中展示此功能。
3.3.2.2 sizes()和setSizes()
在分割器中获取和设置每个控件的宽度或高度。
如果分割器是水平的,则每个控制器的宽度将从左到右设置。如果分割器是垂直的,则每个控制器的高度将从上到下设置。
列表中的额外值被忽略了。如果列表中的值太小,则结果不定义,但程序仍然很好。
分割器的整体尺寸不受影响。相反,控件中分布着任何额外/缺失的空间,根据尺寸的相对重量(伸缩因子)。
若*尺寸为0,则控件将不可见。
保留控件的尺寸策略。换句话说,小于控件的较小尺寸提示值将被提示值所取代。
3.3.3 注意事项
3.3.3.1 控件的显隐
当隐藏一个控件时,它的空间将分配给其他控件。当它再次显示时,它将被恢复。
3.3.3.2 布局器与分割器的对比
在QSplitter不能直接添加QLayout是的,这是因为QSplitter继承自QFrame的,而QLayout继承自QObject和QLayoutItem是的,布局是一套算法,QSplitter是窗口控件,不能直接添加,只有布局才能添加子布局。
因为QSplitter是窗户控制器,当然可以用setLayout()或使QSplitter作为QLayout父类或使用addWidget()替代。
3.3.4 示例
新建项目SpliterWidget,类名SpliterWidget,基类为QWidget。
拖入两个QCheckBox,并且都勾选属性checkable,checked
再拖入一个QTextEdit和QPushButton
spliterwidget.h
#ifndef SPLITERWIDGET_H#define SPLITERWIDGET_H#include
#include namespace Ui {class SpliterWidget;}class SpliterWidget : public QWidget{ Q_O ECTpublic: explicit SpliterWidget(QWidget parent = 0); ~SpliterWidget();protected: //重写关闭事件,以后再讲解 void closeEvent(QCloseEvent e);private slots: void on_check_opaqueResize_toggled(bool checked); void on_check_collapsible_toggled(bool checked);private: Ui::SpliterWidget ui; QByteArray state; QSettings settings;};#endif // SPLITERWIDGET_Hspliterwidget.cpp
#include #include #include "spliterwidget.h"#include "ui_spliterwidget.h"SpliterWidget::SpliterWidget(QWidget parent) : QWidget(parent), ui(new Ui::SpliterWidget), settings("MySofts","SpliterWidget"){ ui->setupUi(this); //这里用来将分割器上次关闭前的状态从注册表中加载 //注册表路径为:HKEY_CURRENT_USERSoftwareMySoftsSpliterWidget if (settings.contains("splitterSizes")) ui->splitter->restoreState(settings.value("splitterSizes").toByteArray()qDebug() << "is restored"; } else qDebug() << "first launch SpliterWidget"; SpliterWidget::~SpliterWidget(){ delete ui;}void SpliterWidget::closeEvent(QCloseEvent e)分割器的状态在关闭时保存 settings.setValue("splitterSizes",ui->splitter->saveState(); QWidget::closeEvent(e);}void SpliterWidget::on_check_opaqueResize_toggled(bool checked){ ui->splitter->setOpaqueResize(checked);}void SpliterWidget::on_check_collapsible_toggled(bool checked){ //设置所有控件是否可折叠,如果想设置控件,可以使用setCollapsible(); ui->splitter->setChildrenCollapsible(checked);}编译操作程序,调整分割器大小,关闭窗口,再次打开程序,恢复分割器关闭前的状态。
好了,今天就来说说分割器的内容。下次见。