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

基本Widgets(23):【類】QAbstractScrollArea [官翻]

技術標籤:Qt

文章目錄

QAbstractScrollArea Class

QAbstractScrollArea小部件提供了一個帶有按需滾動條的滾動區域。

Header#include < QAbstractScrollArea >
qmakeQT += widgets
InheritsQFrame
Inherited ByQAbstractItemView, QGraphicsView, QMdiArea, QPlainTextEdit, QScrollArea, and QTextEdit

詳細說明

QAbstractScrollArea是滾動區域的低階抽象。該區域提供了一個稱為viewport中心小部件,在其中滾動區域的內容(即,在viewport中呈現內容的可見部分)。

視口旁邊是一個垂直滾動條,下面是一個水平滾動條。當所有區域內容都適合視口時,根據滾動條的Qt::ScrollBarPolicy,每個滾動條可以是可見的,也可以是隱藏的。隱藏滾動條時,視口將展開以覆蓋所有可用空間。當滾動條再次可見時,視口將收縮,以便為滾動條騰出空間。

可以在視口周圍保留邊距區域,請參見setViewportMargins() 。該特性主要用於將QHeaderView小部件放置在滾動區域的上方或旁邊。QAbstractScrollArea的子類應該實現邊距。

繼承QAbstractScrollArea時,需要執行以下操作:

  • 通過設定滾動條的範圍、值、頁面步長和跟蹤其移動來控制滾動條。
  • 根據滾動條的值在視口中繪製區域的內容。
  • 在viewportEvent() 中處理視口接收到的事件-尤其是調整事件大小。
  • 使用viewport->update() 更新視口的內容,而不是update() ,因為所有繪製操作都在視口上進行。

使用Qt::ScrollBarAsNeeded(預設值)的滾動條策略,QAbstractScrollArea在滾動條提供非零滾動範圍時顯示滾動條,否則隱藏滾動條。

每當視口接收到調整大小事件或內容大小更改時,滾動條和視口都應更新。當滾動條值更改時,視口也需要更新。滾動條的初始值通常在區域接收新內容時設定。

我們給出了一個簡單的例子,其中我們實現了一個可以滾動任何QWidget的滾動區域。我們使小部件成為視口的子部件;這樣,我們不必計算要繪製的小部件的哪個部分,只需使用QWidget::move() 移動小部件即可。當區域內容或視口大小更改時,我們將執行以下操作:

     QSize areaSize = viewport()->size();
     QSize  widgetSize = widget->size();

     verticalScrollBar()->setPageStep(areaSize.height());
     horizontalScrollBar()->setPageStep(areaSize.width());
     verticalScrollBar()->setRange(0, widgetSize.height() - areaSize.height());
     horizontalScrollBar()->setRange(0, widgetSize.width() - areaSize.width());
     updateWidgetPosition();

當滾動條改變值時,我們需要更新小部件的位置,即找到要在視口中繪製的小部件部分:

     int hvalue = horizontalScrollBar()->value();
     int vvalue = verticalScrollBar()->value();
     QPoint topLeft = viewport()->rect().topLeft();

     widget->move(topLeft.x() - hvalue, topLeft.y() - vvalue);

為了跟蹤滾動條的移動,請重新實現虛擬函式scrollContentsBy() 。要微調滾動行為,請連線到滾動條的QAbstractSlider::actionTriggered() 訊號,並根據需要調整QAbstractSlider::sliderPosition。

為方便起見,QAbstractScrollArea在virtualViewPortEvent() 處理程式中提供了所有視口事件。在有意義的情況下,QWidget的專用處理程式被重新對映到視口事件。重新對映的專用處理程式是:paintEvent() 、mousePresseEvent() 、mouseReleaseEvent() 、mouseDoubleClickEvent() 、mouseMoveEvent() 、wheelEvent() 、dragEnterEvent() 、dragMoveEvent() 、dragLeaveEvent() 、dropEvent() 、contextMenuEvent() 和resizeEvent() 。

QScrollArea繼承了QAbstractScrollArea,為任何QWidget提供平滑的滾動(即,widget逐畫素滾動)。如果需要更專門的行為,只需要將QAbstractScrollArea子類化。例如,如果區域的全部內容不適合在QWidget上繪製,或者您不希望平滑滾動,則這是正確的。

公共型別

enum SizeAdjustPolicy

此列舉指定當視口大小更改時,QAbstractScrollArea的大小提示應如何調整。

ConstantValueDescription
AdjustIgnored0滾動區域的行為將與以前一樣-不做任何調整。
AdjustToContentsOnFirstShow1滾動區域將在第一次顯示時調整到其視口。
AdjustToContents2滾動區域將始終根據視口進行調整

屬性

  1. horizontalScrollBarPolicy: Qt::ScrollBarPolicy 水平滾動條的策略

    預設策略是Qt::scrollbarasneed。

    Access functions:

    • Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
    1. void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
  2. verticalScrollBarPolicy: Qt::ScrollBarPolicy 垂直滾動條的策略

    預設策略是Qt::scrollbarasneed。

    Access functions:

    • Qt::ScrollBarPolicy verticalScrollBarPolicy() const
    • void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)

    enum Qt::ScrollBarPolicy

    此列舉型別描述QAbstractScrollArea的滾動條的各種模式。

    ConstantValueDescription
    Qt::ScrollBarAsNeeded0當內容太大而無法容納時,QAbstractScrollArea會顯示一個滾動條。這是預設值。
    Qt::ScrollBarAlwaysOff1QAbstractScrollArea從不顯示滾動條。
    Qt::ScrollBarAlwaysOn2QAbstractScrollArea始終顯示一個滾動條。在具有瞬時滾動條的系統上(例如,在版本10.7的Mac上),此屬性被忽略。
  3. sizeAdjustPolicy: SizeAdjustPolicy 當視口大小更改時滾動區域大小如何更改的策略

    預設策略是QAbstractScrollArea::AdjustIgnored。更改此屬性實際上可能會調整滾動區域的大小。

    Access functions:

    • QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
    • void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)

公共函式

構造和析構

  1. QAbstractScrollArea(QWidget *parent = nullptr)
  2. virtual ~QAbstractScrollArea()

屬性相關

  1. Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
  2. void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
  3. Qt::ScrollBarPolicy verticalScrollBarPolicy() const
  4. void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
  5. QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
  6. void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)

特殊

  1. QWidget * cornerWidget() const

  2. void setCornerWidget(QWidget *widget)

  3. QScrollBar * horizontalScrollBar() const

  4. void setHorizontalScrollBar(QScrollBar *scrollBar)

  5. QScrollBar * verticalScrollBar() const

  6. void setVerticalScrollBar(QScrollBar *scrollBar)

  7. QWidget * viewport() const

  8. void setViewport(QWidget *widget)

  9. virtual void setupViewport(QWidget *viewport)

  10. void addScrollBarWidget(QWidget *widget, Qt::Alignment alignment)

    在對齊指定的位置新增小部件作為滾動條小部件

    滾動條小部件顯示在水平或垂直滾動條的旁邊,可以放在滾動條的兩側。如果希望滾動條小部件始終可見,請將相應滾動條的滾動條策略設定為AlwaysOn。

    對齊方式必須是對映到水平滾動條的Qt::Alignleft和Qt::AlignRight之一,或對映到垂直滾動條的Qt::AlignTop和Qt::AlignBottom之一。

    滾動條小部件可以通過重新設定小部件的父級或刪除它來刪除。還可以使用QWidget::hide() 隱藏小部件
    滾動條小部件將調整大小以適應當前樣式的滾動條几何圖形。下面介紹了水平滾動條上滾動條小部件的情況:
    小部件的高度將設定為與滾動條的高度相匹配。要控制小部件的寬度,請使用QWidget::setMinimumWidth和QWidget::setMaximumWidth,或者實現QWidget::sizeHint() 並設定水平大小策略。如果您想要一個正方形小部件,請呼叫QStyle::pixelMetric(QStyle::PM_ScrollBarExtent)並將寬度設定為該值。

  11. QWidgetList scrollBarWidgets(Qt::Alignment alignment)

  12. QSize maximumViewportSize() const

重寫的公共函式

  1. virtual QSize minimumSizeHint() const override
  2. virtual QSize sizeHint() const override

受保護的函式

  1. virtual void scrollContentsBy(int dx, int dy)
  2. void setViewportMargins(int left, int top, int right, int bottom)
  3. void setViewportMargins(const QMargins &margins)
  4. virtual bool viewportEvent(QEvent *event)
  5. QMargins viewportMargins() const
  6. virtual QSize viewportSizeHint() const

重寫的受保護的函式

  1. virtual void contextMenuEvent(QContextMenuEvent *e) override
  2. virtual void dragEnterEvent(QDragEnterEvent *event) override
  3. virtual void dragLeaveEvent(QDragLeaveEvent *event) override
  4. virtual void dragMoveEvent(QDragMoveEvent *event) override
  5. virtual void dropEvent(QDropEvent *event) override
  6. virtual bool event(QEvent *event) override
  7. virtual void keyPressEvent(QKeyEvent *e) override
  8. virtual void mouseDoubleClickEvent(QMouseEvent *e) override
  9. virtual void mouseMoveEvent(QMouseEvent *e) override
  10. virtual void mousePressEvent(QMouseEvent *e) override
  11. virtual void mouseReleaseEvent(QMouseEvent *e) override
  12. virtual void paintEvent(QPaintEvent *event) override
  13. virtual void resizeEvent(QResizeEvent *event) override
  14. virtual void wheelEvent(QWheelEvent *e) override