(1)
(2)本類的繼承關系如下,所以說分隔條屬于容器:
(3)本類的屬性:
(4) 這是一份 QSplitter 的舉例代碼,注意其構造函數時候的傳參:
#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QFrame>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QHBoxLayout * horizontalLayout;QSplitter * splitter;QFrame * frame;QFrame * frame_2;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName(QString::fromUtf8("Widget"));Widget->resize(523, 339);horizontalLayout = new QHBoxLayout(Widget); //為主窗體采用水平布局horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));splitter = new QSplitter(Widget); //對,生成的是水平分隔條。本分割條屬于本窗體容器。splitter->setObjectName(QString::fromUtf8("splitter"));splitter->setOrientation(Qt::Horizontal);frame = new QFrame(splitter);frame->setObjectName(QString::fromUtf8("frame"));frame->setFrameShape(QFrame::StyledPanel);frame->setFrameShadow(QFrame::Plain);frame->setLineWidth(2);splitter->addWidget(frame); //把左 frame 添加入 splitter//繼承關系上, splitter 才擴充了添加窗體的方法frame_2 = new QFrame(splitter);frame_2->setObjectName(QString::fromUtf8("frame_2"));frame_2->setFrameShape(QFrame::StyledPanel);frame_2->setFrameShadow(QFrame::Plain);frame_2->setLineWidth(2);splitter->addWidget(frame_2); //把右 frame 添加入 splitterhorizontalLayout->addWidget(splitter); //把分隔條 splitter 添加到主窗體的布局中//可見,分隔條相當于容器,隱身的容器;也相當于布局,可以接收子容器,還可以被放入布局中retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H
(5)給出源代碼,來自于頭文件 qsplitter . h :
#ifndef QSPLITTER_H
#define QSPLITTER_H#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qframe.h>
#include <QtWidgets/qsizepolicy.h>/*
QT_CONFIG宏實現了對 Qt特性的安全編譯時檢查。特性可以處于三種狀態:
0 或未定義:在測試時會引發編譯錯誤
-1:該功能不可用
1:該功能可用The QT_CONFIG macro implements a safe compile time check for features of Qt.Features can be in three states:0 or undefined: This will lead to a compile error when testing for it-1: The feature is not available1: The feature is available
*/
#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)#define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1,\"Required feature " #feature " for file " __FILE__ " not available.")QT_REQUIRE_CONFIG(splitter); //條件編譯,確保有了此源代碼模塊QT_BEGIN_NAMESPACE //說明本類定義在 QT 的全局空間class QSplitterPrivate;
class QTextStream;class QSplitterHandle;// class QLayout : public QObject, public QLayoutIte
// class QWidget : public QObject, public QPaintDevice
//class QFrame : public QWidget
//一個分割器允許用戶通過拖動它們之間的邊界來控制子控件的大小。
//任何數量的控件都可以由一個單一的分割器控制。
//如果在調用 insertWidget()或addWidget()時,一個部件已經在 QSplitter中,
//它將移動到新位置。這可以用于稍后重新排序 splitter中的部件。
//可以使用indexOf()、widget()和count()來訪問splitter 中的部件。
//默認的QSplitter將其子元素水平排列(并排);
//您可以使用setOrientation(Qt::Vertical)將其子元素垂直排列。
//默認情況下,所有小部件都可以像用戶希望的那樣大或小,
//介于小部件的minimumSizeHint()(或minimumSize())和maximumSize()之間。
//默認情況下,QSplitter會動態調整其子項的大小。
//如果您希望QSplitter僅在調整大小操作結束時調整子項的大小,請調用setOpaqueResize(false)。
//小部件之間初始大小的分布是通過將初始大小與拉伸因子相乘來確定的。
//您還可以使用setSizes()來設置所有小部件的大小。函數sizes()返回由用戶設置的大小。
//或者,您可以使用saveState()和restoreState()分別保存和恢復小部件的大小。
//當你隱藏(hide)一個子元素時,它的空間將被分配到其他子元素中。當你再次顯示(show)它時,它將被恢復。
class Q_WIDGETS_EXPORT QSplitter : public QFrame
{Q_OBJECT //又插入了此宏//此屬性保存了分割器的方向.//默認情況下,方向是水平(即小部件是并排排列的)。可能的方向是Qt::Horizontal和Qt::Vertical。Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)//如果分隔條在交互式移動時動態(不透明)地重新調整大小,則返回true。否則返回 false。//默認的縮放行為取決于樣式(由SH_Splitter_OpaqueResize樣式提示確定)。//但是,您可以通過調用setOpaqueResize()來覆蓋它。Q_PROPERTY(bool opaqueResize READ opaqueResize WRITE setOpaqueResize)//不透明//此屬性包含分隔符手柄的寬度。即被分隔條隔開的內部各控件之間的間距。//默認情況下,此屬性包含一個值,該值取決于用戶的平臺和樣式偏好。//如果您將 handleWidth 設置為1或0,則實際抓取區域將增長到與其各自的小部件重疊幾個像素Q_PROPERTY(int handleWidth READ handleWidth WRITE setHandleWidth)//這個屬性表示子控件是否可以被用戶縮小到0的大小。默認情況下,子元素是可折疊的。//使用setCollapsible()方法可以啟用或禁用單個子元素的折疊。Q_PROPERTY(bool childrenCollapsible //倒塌;垮塌;可折疊 collapseREAD childrenCollapsible WRITE setChildrenCollapsible)private:Q_DISABLE_COPY(QSplitter)Q_DECLARE_PRIVATE(QSplitter)
private:friend class QSplitterHandle;public://構造一個水平分割器,將 parent參數傳遞給 QFrame構造函數。explicit QSplitter(QWidget * parent = nullptr); //本組件屬于 parent容器explicit QSplitter(Qt::Orientation, QWidget * parent = nullptr);//Constructs a splitter with the given orientation and parent.~QSplitter();//Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)Qt::Orientation orientation() const;void setOrientation(Qt::Orientation); //方向就是水平或垂直兩種//Q_PROPERTY(bool opaqueResize READ opaqueResize WRITE setOpaqueResize)bool opaqueResize() const;void setOpaqueResize(bool opaque = true);//Q_PROPERTY(int handleWidth READ handleWidth WRITE setHandleWidth)int handleWidth() const;void setHandleWidth(int);//Q_PROPERTY(bool childrenCollapsible
// READ childrenCollapsible WRITE setChildrenCollapsible)bool childrenCollapsible() const;void setChildrenCollapsible(bool);//Returns true if the widget at index is collapsible, otherwise returns false.bool isCollapsible(int index) const;void setCollapsible(int index, bool);//Sets whether the child widget at index is collapsible to collapse.//默認情況下,子項是可折疊的,這意味著用戶可以將它們的大小縮小到大小0,//即使它們具有非零的minimumSize()或minimumSizeHint()。//可以通過調用此函數在每個 widget的基礎上更改此行為,//也可以通過設置 childrencollapsible 屬性為拆分器中的所有 widget 全局更改此行為。//返回此拆分器中所有小部件的大小參數的列表。//如果拆分器的方向是水平,則列表包含從左到右的像素寬度;//如果方向是垂直的,則列表包含從頂部到底部的像素高度。//將值傳遞給另一個分塊器的 setSizes()函數將產生一個布局與此相同的分塊器。QList<int> sizes() const; //本函數的返回值是一個鏈表容器void setSizes(const QList<int> &list);//將子控件的相應大小設置為列表中給出的值。//如果分隔線是水平的,則值以像素為單位設置每個小部件的寬度,從左到右。//如果分隔線是垂直的則設置每個小部件的高度,從上到下。//列表中的額外值將被忽略。如果列表包含太少的值,結果是不確定的,但程序仍然會表現得很好。//分割器組件的整體大小不受影響。相反,任何額外的/缺失的空間將根據尺寸的相對權重在組件之間分配。//如果您指定大小為0,則小部件將不可見。//小部件的大小策略將被保留。也就是說小于相應小部件的最小大小提示值的值將被提示值替換。//保存分割器的布局狀態。//通常,這用于與QSettings一起使用,以記住未來會話的大小。版本號作為數據的一部分存儲。QByteArray saveState() const;bool restoreState(const QByteArray &state);//Restores the splitter's layout to the state specified.//Returns true if the state is restored; otherwise returns false.QSize sizeHint() const override;QSize minimumSizeHint() const override;//Returns the valid range of the splitter at index in *min and *max//if min and max are not 0.void getRange(int index, int *min, int *max) const;//Returns the number of widgets contained in the splitter's layout.int count() const;int indexOf(QWidget *w) const;QWidget * widget(int index) const; //!!擴充了添加窗體的方法,就類似于 Qlayout了void addWidget(QWidget *widget);void insertWidget(int index, QWidget *widget);QWidget * replaceWidget(int index, QWidget *widget);void refresh(); //不要調用本函數//Updates the splitter's state. You should not need to call this function.//Updates the size policy of the widget at position index to//have a stretch factor of stretch.//stretch 并不是有效的拉伸因子;有效的拉伸因子是通過取小部件的初始大小并//將其乘以 stretch 計算得出的 。void setStretchFactor(int index, int stretch);//返回分割器布局中給定索引處左側(或上方)的項的句柄,//如果不存在這樣的項則返回nullptr。索引為0的句柄總是隱藏的。//對于像阿拉伯語和希伯來語這樣的右至左語言,水平分隔符的布局是顛倒的。在索引處的控件右側是手柄。QSplitterHandle * handle(int index) const;
protected:virtual QSplitterHandle * createHandle();//返回一個新的分隔符處理程序作為此分隔符的子控件。//此函數可以在子類中重新實現,以提供對自定義處理程序的支持。bool event(QEvent *) override;void childEvent(QChildEvent *) override;void resizeEvent(QResizeEvent *) override;void changeEvent(QEvent *) override;//在位置 pos 顯示橡皮筋 RubberBand。如果 pos是負數,則移除皮筋。void setRubberBand(int position);int closestLegalPosition(int pos, int index);//Returns the closest legal position to pos of the widget at index.//對于阿拉伯語和希伯來語等從右向左的語言,水平分隔符的布局//是顛倒的。然后從小部件的右邊緣測量位置。//將分割器手柄的左邊緣或頂部邊緣在索引 index 處移動到盡可能靠近位置pos的位置,//位置pos是從小部件的左邊緣或頂部邊緣的距離。void moveSplitter(int pos, int index);Q_SIGNALS: //信號函數void splitterMoved(int pos, int index);//當 index 索引處的分路器手柄移動到位置 pos 時,會發出此信號。
}; //完結 class QSplitter : public QFrameclass QSplitterHandlePrivate;//當人們想到分割器時,通常會想到QSplitterHandle。它是用于調整部件大小的控制柄。
//使用 QSplitter的典型開發人員永遠不必擔心 QSplitterHandle。
//它提供給那些想要提供額外功能(如彈出菜單)的分割器處理程序的開發人員。
//創建分割器處理程序的典型方法是子類化QSplitter,然后重寫QSplitter::createHandle()以
//實例化自定義分割器處理程序。
class Q_WIDGETS_EXPORT QSplitterHandle : public QWidget
{Q_OBJECT
public:explicit QSplitterHandle(Qt::Orientation o, QSplitter *parent);~QSplitterHandle();void setOrientation(Qt::Orientation o);Qt::Orientation orientation() const;bool opaqueResize() const;QSplitter *splitter() const;QSize sizeHint() const override;protected:void paintEvent(QPaintEvent *) override;void mouseMoveEvent(QMouseEvent *) override;void mousePressEvent(QMouseEvent *) override;void mouseReleaseEvent(QMouseEvent *) override;void resizeEvent(QResizeEvent *) override;bool event(QEvent *) override;void moveSplitter(int p);int closestLegalPosition(int p);private:Q_DISABLE_COPY(QSplitterHandle)Q_DECLARE_PRIVATE(QSplitterHandle)
};QT_END_NAMESPACE#endif // QSPLITTER_H
(6)
謝謝