有時布局中的子控件不能完全顯示,或者我們希望子控件能暫時占據(jù)更多的顯示空間,然后我們需要使用另一個布局管理分割器。
當鼠標移動到子控件之間的間隔線時,鼠標會變成以下形狀
3.3.1 QSplitter
1 childrenCollapsible 子控件能否折疊?
2 handleWidth 分割線寬度。
3 opaqueResize 是否立即改變大小。
true-默認情況下,當拖動分割線時,控件隨分割線啟動。false-拖動分割線時,只有分割線移動,松開鼠標后,控制器才能改變大小。
4 orientation 分割器方向,水平或垂直。
3.3.2 常用函數(shù)
3.3.2.1 saveState()和restoreState()
保持當前狀態(tài)和恢復(fù)以前狀態(tài)。當我們使用分割器時,許多控制器的大小會發(fā)生變化,當我們想要恢復(fù)一定狀態(tài)時,我們可以使用這兩個函數(shù)。
當您開發(fā)的軟件再次打開時,如果您想恢復(fù)到最后一個布局圖片,您也可以使用這兩個函數(shù)。我將在下面的例子中展示此功能。
3.3.2.2 sizes()和setSizes()
在分割器中獲取和設(shè)置每個控件的寬度或高度。
如果分割器是水平的,則每個控制器的寬度將從左到右設(shè)置。如果分割器是垂直的,則每個控制器的高度將從上到下設(shè)置。
列表中的額外值被忽略了。如果列表中的值太小,則結(jié)果不定義,但程序仍然很好。
分割器的整體尺寸不受影響。相反,控件中分布著任何額外/缺失的空間,根據(jù)尺寸的相對重量(伸縮因子)。
若*尺寸為0,則控件將不可見。
保留控件的尺寸策略。換句話說,小于控件的較小尺寸提示值將被提示值所取代。
3.3.3 注意事項
3.3.3.1 控件的顯隱
當隱藏一個控件時,它的空間將分配給其他控件。當它再次顯示時,它將被恢復(fù)。
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: //重寫關(guān)閉事件,以后再講解 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); //這里用來將分割器上次關(guān)閉前的狀態(tài)從注冊表中加載 //注冊表路徑為: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)分割器的狀態(tài)在關(guān)閉時保存 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){ //設(shè)置所有控件是否可折疊,如果想設(shè)置控件,可以使用setCollapsible(); ui->splitter->setChildrenCollapsible(checked);}編譯操作程序,調(diào)整分割器大小,關(guān)閉窗口,再次打開程序,恢復(fù)分割器關(guān)閉前的狀態(tài)。
好了,今天就來說說分割器的內(nèi)容。下次見。