https://mp.weixin.qq.com/s?__biz=MzU1ODIyOTQ3Mg==&mid=2247483759&idx=1&sn=ac6d56b2abe497e99d87495beda72615&chksm=fc28f3e0cb5f7af601796cd305451d4549d3051d7295a770a416fa332b4cdfc15759c2b278c9&mpshare=1&scene=1&srcid=0204FYnLvez20ju7O9iLYAq2&sharer_sharetime=1580827308259&sharer_shareid=33fb973e60510684b6f44098f762e42c&key=4ee1913bca79c78b17f3785ae2a7de7735459b680518c7e1f5028e9378edc17be991e989abfe78295bac8c48834ac9b472588b0d8b0b64ff0e5174410f1ab7179387c7014c194cd0bb31890522960e00&ascene=1&uin=Mzc3MjM5MzYyOQ%3D%3D&devicetype=Windows+7&version=6208006f&lang=zh_CN&exportkey=A%2FpDN3zZoK6LdRjS%2F6nxqN0%3D&pass_ticket=G8YP2jrw5wj%2F8z3hLH2LoKrOlhW%2BEgSdWWWhFhvDLD3ZisgQnZPqhJzHLu8hOeZ5常用函数 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 <QWidget>
- #include <QSettings>
- namespace Ui {
- class SpliterWidget;
- }
- class SpliterWidget : public QWidget
- {
- Q_OBJECT
- public:
- 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_H
- spliterwidget.cpp
- #include <QDebug>
- #include <QSettings>
- #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_USER\Software\MySofts\SpliterWidget
- 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);
- }
复制代码 编译运行程序,调整分割器的大小,关闭窗口,再次打开程序,程序恢复关闭前分割器的状态。
|