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());
}
};