1. 程式人生 > 其它 >基本Widgets(11):【類】QScrollBar [官翻]

基本Widgets(11):【類】QScrollBar [官翻]

技術標籤:Qt

文章目錄

QScrollBar Class

QScrollBar小部件提供垂直或水平滾動條。

Header#include < QScrollBar >
qmakeQT += widgets
InheritsQAbstractSlider
Inherited By

詳細說明

滾動條是一個控制元件,允許使用者訪問文件中比用於顯示文件的小部件大的部分。它提供使用者在文件中的當前位置以及可見文件的數量的可視指示。滾動條通常配有其他控制元件,可以實現更精確的導航。Qt以適合每個平臺的方式顯示滾動條。

如果需要在另一個小部件上提供滾動檢視,那麼使用QScrollArea類可能更方便,因為它提供了一個視口小部件和滾動條。如果您需要使用QAbstractScrollArea為專用小部件實現類似的功能,那麼QScrollBar非常有用;例如,如果您決定將QAbstractItemView 作為子類。對於大多數其他使用滑塊控制元件獲取給定範圍內的值的情況,QSlider類可能更適合您的需要。

滾動條通常包括四個獨立的控制元件:滑塊、滾動箭頭和頁面控制元件。
  • a.滑塊提供了一種快速轉到文件任何部分的方法,但不支援在大型文件中進行精確導航。
  • b.滾動箭頭是可用於精確導航到文件中特定位置的按鈕。對於連線到文字編輯器的垂直滾動條,它們通常會將當前位置向上或向下移動一行,並少量調整滑塊的位置。在編輯器和列表框中,“行”可能表示一行文字;在影象檢視器中,它可能表示20畫素。
  • c.頁面控制元件是拖動滑塊的區域(滾動條的背景)。單擊此處將滾動條移向單擊一個“頁面”。此值通常與滑塊的長度相同。

    每個滾動條都有一個值,指示滑塊距滾動條起點的距離;這是通過value() 獲得的,並通過setValue() 設定的。此值始終位於為滾動條定義的值的範圍內,從 minimum() 到 maximum() 包括在內。可以使用setMinimum() 和setMaximum() 設定可接受值的範圍。在最小值時,滑塊的上邊緣(對於垂直滾動條)或左邊緣(對於水平滾動條)將位於滾動條的頂端(或左端)。最大值時,滑塊的底部(或右)邊緣將位於滾動條的底部(或右)端。

    滑塊的長度通常與頁面步長的值相關,通常表示滾動檢視中顯示的文件區域的比例。頁面步長是當用戶按page Up和page Down鍵時值的變化量,並用setPageStep() 設定。使用游標鍵對行步驟定義的值進行較小的更改,並使用setSingleStep() 設定此數量。

    請注意,使用的值的範圍與滾動條小部件的實際大小無關。在為範圍和頁面步數選擇值時,不需要考慮這一點。

    為滾動條指定的值的範圍通常與為QSlider指定的值的範圍不同,因為需要考慮滑塊的長度。如果我們有一個100行的文件,並且我們只能在一個小部件中顯示20行,那麼我們可能希望構造一個頁面步長為20、最小值為0、最大值為80的滾動條。這將給我們一個滾動條與五個“頁”。

    文件長度、滾動條中使用的值範圍和頁面步驟之間的關係在許多常見情況下都很簡單。滾動條的值範圍是通過從表示文件長度的值中減去所選的頁面步長來確定的。在這種情況下,以下公式很有用: document length = maximum() - minimum() + pageStep().

    QScrollBar只提供整數範圍。請注意,儘管QScrollBar處理非常大的數字,但當前螢幕上的滾動條不能有效地表示大約100000畫素以上的範圍。除此之外,使用者很難使用鍵盤或滑鼠控制滑塊,滾動箭頭的用途也很有限。

    ScrollBar從QAbstractSlider繼承了一組全面的訊號:

    • 當滾動條的值發生更改時,將發出valueChanged() ,tracking() 確定此訊號是否在使用者互動期間發出。
    • rangeChanged() 在滾動條的值範圍更改時發出
    • 當用戶開始拖動滑塊時,會發出sliderPressed()
    • 當用戶拖動滑塊時,會發出sliderMoved()
    • 當用戶釋放滑塊時,會發出sliderReleased()
    • 當用戶互動或通過triggerAction() 函式更改滾動條時,將發出ActionTrigger()

    滾動條可以由鍵盤控制,但它的預設focusPolicy() 為Qt::NoFocus。使用setFocusPolicy() 啟用與滾動條的鍵盤互動:

    • 左/右移動水平滾動條一步
    • 向上/向下移動垂直滾動條一步
    • PageUp向上移動一頁
    • PageDown向下移動一頁
    • 原點移到起點(mininum)
    • 末端移動到末端(最大值)

    通過使用triggerAction() 函式來模擬使用者與滾動條控制元件的互動,可以控制滑塊本身。如果您有許多使用公共值範圍的不同小部件,這將非常有用。

    大多數GUI樣式都使用pageStep() 值來計算滑塊的大小。

    公共函式

    構造和析構

    1. QScrollBar(Qt::Orientation orientation, QWidget *parent = nullptr)

    2. QScrollBar(QWidget *parent = nullptr)

    3. virtual ~QScrollBar()

      方向預設為垂直滾動條。
      最小值預設為0,最大值為99,單步大小為1,頁面步長為10,初始值為0。

    重寫的公共函式

    1. virtual bool event(QEvent *event) override
    2. virtual QSize sizeHint() const override

    受保護的函式

    1. void initStyleOption(QStyleOptionSlider *option) const

    重寫的受保護的函式

    1. virtual void contextMenuEvent(QContextMenuEvent *event) override
    2. virtual void hideEvent(QHideEvent *) override
    3. virtual void mouseMoveEvent(QMouseEvent *e) override
    4. virtual void mousePressEvent(QMouseEvent *e) override
    5. virtual void mouseReleaseEvent(QMouseEvent *e) override
    6. virtual void paintEvent(QPaintEvent *) override
    7. virtual void sliderChange(QAbstractSlider::SliderChange change) override
    8. virtual void wheelEvent(QWheelEvent *event) override

    小例項

    #include <QtWidgets>
    #include "Widget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc,argv);
        app.setApplicationName ("QScrollBar");
        QWidget w;
        w.resize (300,200);
        QHBoxLayout mainLayout(&w);
    
        QScrollBar widget1;
        QScrollBar widget2;
        QScrollBar widget3;
    
        widget1.setStyleSheet ("background-color:red");
        widget2.setStyleSheet ("background-color:green");
        widget3.setStyleSheet ("background-color:blue");
    
    //    widget1.setOrientation (Qt::Horizontal);
        widget2.setOrientation (Qt::Horizontal);
    //    widget3.setOrientation (Qt::Horizontal);
    
        // 佈局加入,此時部件的父類是mainLayout
        mainLayout.addWidget (&widget1);
        mainLayout.addWidget (&widget2);
        mainLayout.addWidget (&widget3);
    
        w.show ();
        app.exec();
        return 0;
    }