有時(shí)布局中的控制器不能完全顯示,或者我希望子控制器能暫時(shí)占用更多的室內(nèi)空間,最后我們需要使用另一個(gè)布局管理方法分割器。
當(dāng)鼠標(biāo)移動(dòng)到子控件之間的間隔線時(shí),計(jì)算機(jī)鼠標(biāo)會(huì)變成以下樣子
3.3.1 QSplitter1 childrenCollapsible 子控件能伸縮嗎?
2 handleWidth 總寬度的分割線。
3 opaqueResize 尺寸是否立即改變。
true-在默認(rèn)設(shè)置的前提下,當(dāng)拖動(dòng)分割線時(shí),控件隨分割線運(yùn)行。false-拖動(dòng)分割線時(shí),只有移動(dòng)分割線,松開(kāi)電腦鼠標(biāo),控制器才能改變尺寸。4 orientation 切割方位,水平或垂直。
3.3.2 常用函數(shù)3.3.2.1 saveState()和restoreState()
維護(hù)系統(tǒng)狀態(tài)和修復(fù)前的情況。當(dāng)我們使用分割器時(shí),許多控制器的大小會(huì)發(fā)生變化。當(dāng)我們想修復(fù)某種狀態(tài)時(shí),我們可以使用這兩個(gè)函數(shù)公式。
如果您想在軟件再次打開(kāi)后恢復(fù)正常的最后一個(gè)布局界面,您也可以使用這兩個(gè)函數(shù)公式和隱私功能。我將在下面的例子中為您嘗試。
3.3.2.2 sizes()和setSizes()
在分割器中獲得和設(shè)置每個(gè)控件的間距或高度。
如果分割器是標(biāo)準(zhǔn)的,則每個(gè)控制器的總寬度將從左到右設(shè)置。如果分割器垂直,則每個(gè)控制器的高度將從上到下設(shè)置。
頁(yè)面上的附加值被忽略了。假如頁(yè)面上的值太小,結(jié)論不定義,但程序流程還是很好的。
分割器的整體規(guī)格影響不大。另一方面,根據(jù)尺寸相對(duì)凈重(伸縮因素),所有附加/缺失的室內(nèi)空間都分布在控件中。
若具體規(guī)格為0,則控件將看不見(jiàn)。
保存控件尺寸對(duì)策。換句話說(shuō),提醒值低于控件的較小規(guī)格應(yīng)被提醒值所取代。
3.3.3 常見(jiàn)問(wèn)題3.3.3.1 顯隱控件
當(dāng)一個(gè)控件被隱藏時(shí),它的室內(nèi)空間將配給其他控件。當(dāng)它們?cè)俅物@示時(shí),它將被修復(fù)。
3.3.3.2 布局器與分割器進(jìn)行比較
在QSplitter不能直接添加QLayout是的,主要是因?yàn)镼Splitter承繼自QFrame的,而QLayout承繼自QObject和QLayoutItem是的,布局是一套優(yōu)化算法,QSplitter是對(duì)話框控件,不能直接添加,只有布局才能添加子布局。
由于QSplitter窗戶控制器完全可用setLayout()進(jìn)而使QSplitter做為QLayout然后使用成員變量addWidget()取代。
3.3.4 實(shí)例新建工程SpliterWidget,類名SpliterWidget,父類為QWidget。
拖進(jìn)2個(gè)QCheckBox,而且都使用屬性checkable,checked
再拖進(jìn)一個(gè)QTextEdit和QPushButton
spliterwidget.h
#ifndef SPLITERWIDGET_H#define SPLITERWIDGET_H#include <QWidget>#include <QSettings>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 <QDebug>#include <QSettings>#include "spliterwidget.h"#include "ui_spliterwidget.h"SpliterWidget::SpliterWidget(QWidget parent) : QWidget(parent), ui(new Ui::SpliterWidget), settings("MySofts","SpliterWidget(34){ ui->setupUi(this); ///這里用于從注冊(cè)表文件中輸入分割器關(guān)閉前的情況 ///注冊(cè)表文件的方式如下: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)閉時(shí)存儲(chǔ) 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)閉程序,再次打開(kāi)程序,修復(fù)分割器關(guān)閉前的情況。
好了,今天就來(lái)說(shuō)說(shuō)分割器的內(nèi)容。下次見(jiàn)。
大量干貨知識(shí),請(qǐng)關(guān)注微信微信官方賬號(hào):豆豆君,只要關(guān)心,就可以加豆豆君為大家創(chuàng)造。C Qt溝通工作組有利于討論和學(xué)習(xí)。