1.QSplitter 概述

QSplitter 是 Qt 中用於創建可調整分割區域的窗口部件,允許用户通過拖動分割條來調整子部件的大小。

2.基本使用方法

2.1 創建 QSplitter

// 水平分割
QSplitter *horizontalSplitter = new QSplitter(Qt::Horizontal);

// 垂直分割
QSplitter *verticalSplitter = new QSplitter(Qt::Vertical);

// 添加子部件
QTextEdit *leftTextEdit = new QTextEdit;
QTextEdit *rightTextEdit = new QTextEdit;
horizontalSplitter->addWidget(leftTextEdit);
horizontalSplitter->addWidget(rightTextEdit);

2.2 嵌套分割器


// 創建主水平分割器
QSplitter *mainSplitter = new QSplitter(Qt::Horizontal);

// 左側垂直分割器
QSplitter *leftSplitter = new QSplitter(Qt::Vertical);
leftSplitter->addWidget(new QTextEdit);
leftSplitter->addWidget(new QTextEdit);

// 右側垂直分割器
QSplitter *rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(new QTextEdit);
rightSplitter->addWidget(new QTextEdit);

// 添加到主分割器
mainSplitter->addWidget(leftSplitter);
mainSplitter->addWidget(rightSplitter);

2.3 常用屬性設置

// 設置初始分割比例
splitter->setSizes({100, 300});  // 設置子部件的初始大小

// 設置伸縮因子
splitter->setStretchFactor(0, 1);  // 第一個部件伸縮因子為1
splitter->setStretchFactor(1, 3);  // 第二個部件伸縮因子為3

// 設置手柄寬度
splitter->setHandleWidth(5);

// 設置是否可摺疊
splitter->setCollapsible(0, true);  // 允許第一個部件摺疊

2.4 常用方法

// 獲取當前尺寸
QList<int> sizes = splitter->sizes();

// 保存和恢復狀態
QByteArray state = splitter->saveState();
splitter->restoreState(state);

// 設置子部件可見性
splitter->widget(0)->setVisible(true);

// 設置分割條移動時的行為
splitter->setChildrenCollapsible(true);

2.5 分割條樣式

// 通過 QSS 樣式表
splitter->setStyleSheet(
    "QSplitter::handle {"
    "   background-color: gray;"
    "   height: 3px;"  // 水平分割器的手柄高度
    "   width: 3px;"   // 垂直分割器的手柄寬度
    "}"
    "QSplitter::handle:hover {"
    "   background-color: blue;"
    "}"
);

// 創建自定義分割條
class CustomSplitterHandle : public QSplitterHandle
{
public:
    CustomSplitterHandle(Qt::Orientation orientation, QSplitter *parent)
        : QSplitterHandle(orientation, parent) {}
    
protected:
    void paintEvent(QPaintEvent *event) override
    {
        QPainter painter(this);
        painter.fillRect(rect(), Qt::lightGray);
        // 繪製自定義圖案
        painter.setPen(Qt::darkGray);
        painter.drawLine(rect().center().x() - 5, rect().center().y(),
                         rect().center().x() + 5, rect().center().y());
    }
};