3.3 分割器
有時候在佈局中的子控制元件並不能完全顯示,或者我們希望某個子控制元件能暫時佔據更多的顯示空間,這時,我們就需要用到另一種佈局管理——分割器。
當你將滑鼠移動到子控制元件之間的間隔線時,滑鼠會變成如下形狀
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 <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);
}
編譯執行程式,調整分割器的大小,關閉視窗,再次開啟程式,程式恢復關閉前分割器的狀態。
好了,關於分割器的內容今天先講到這裡,我們下期再見。
更多幹貨,請關注微信公眾號:小豆君,只要關注,便可加入我的C++\Qt交流群一起學習。
相關文章
- 3.3
- +3.3V_Standby和+3.3V_Normal的關係ORM
- 3.3 Shutting Down a DatabaseDatabase
- 數學建模習題3.3
- OpenGL3.3點,線面
- SpringBoot | 3.3 整合MyBatis-PlusSpring BootMyBatis
- AndroidStudio3.3以上color取色Android
- Android Studio3.3的使用Android
- 重磅!Apache Kafka 3.3 正式釋出!ApacheKafka
- python教程3.3:字元和編碼Python字元
- Quick-3.3 開發筆記UI筆記
- 3.3 神經網路的訓練神經網路
- ModSecurity3.3下載安裝教程
- Android Studio3.3你瞭解多少?Android
- 3.3 以太坊核心詞彙詳解
- 演算法筆記習題3.3演算法筆記
- 3.3 編碼/解碼演算法演算法
- 上週熱點回顧(2.26-3.3)
- springmvc-原始碼除錯-3.3-initHandlerAdaptersSpringMVC原始碼除錯APT
- 豬行天下之Python基礎——3.3 字典Python
- 叮咚,TNAS Mobile 3.3已上線,請注意查收!
- TypeScript 3.3來了!快看看有什麼新功能TypeScript
- Vue3.3 的新功能的一些體驗Vue
- CentOS7安裝PostgreSQL15以及PostGIS3.3CentOSSQLS3
- 設計模式【3.3】-- CGLIB動態代理原始碼解讀設計模式CGLib原始碼
- 極簡 Node.js 入門 - 3.3 檔案寫入Node.js
- WTO:2024年全球商品貿易的增長率為3.3%
- P2731 [USACO3.3] 騎馬修柵欄 Riding the Fences
- 3.3 用於多租戶環境的任務和工具
- Helio for mac(音樂創作工具) v3.3免費版Mac
- 中國人健康的頭號殺手:3.3億人中招
- App Annie:2021年中國人均每天用手機3.3小時APP
- 3.3 - Laravel - 5.6 - Route - 載入單個Route例項的主要流程Laravel
- QQ小助手 3.3 中文版 (QQ訊息防撤回及搶?神器)
- 伽馬資料:2020年消費者遊戲投訴比例降至3.3%遊戲
- Babylon.js 3.3釋出:更強大的粒子系統和WebVR支援JSWebVR
- RDIFramework.NET V3.3 WinForm版新增訂單管理主從表事例FrameworkORM
- 微課|玩轉Python輕鬆過二級(3.3節):字典使用要點Python