基本Widgets(23):【類】QAbstractScrollArea [官翻]
技術標籤:Qt
文章目錄
QAbstractScrollArea Class
QAbstractScrollArea小部件提供了一個帶有按需滾動條的滾動區域。
Header | #include < QAbstractScrollArea > |
---|---|
qmake | QT += widgets |
Inherits | QFrame |
Inherited By | QAbstractItemView, 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的大小提示應如何調整。
Constant | Value | Description |
---|---|---|
AdjustIgnored | 0 | 滾動區域的行為將與以前一樣-不做任何調整。 |
AdjustToContentsOnFirstShow | 1 | 滾動區域將在第一次顯示時調整到其視口。 |
AdjustToContents | 2 | 滾動區域將始終根據視口進行調整 |
屬性
-
horizontalScrollBarPolicy: Qt::ScrollBarPolicy 水平滾動條的策略
預設策略是Qt::scrollbarasneed。
Access functions:
- Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
- void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
-
verticalScrollBarPolicy: Qt::ScrollBarPolicy 垂直滾動條的策略
預設策略是Qt::scrollbarasneed。
Access functions:
- Qt::ScrollBarPolicy verticalScrollBarPolicy() const
- void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
enum Qt::ScrollBarPolicy
此列舉型別描述QAbstractScrollArea的滾動條的各種模式。
Constant Value Description Qt::ScrollBarAsNeeded 0 當內容太大而無法容納時,QAbstractScrollArea會顯示一個滾動條。這是預設值。 Qt::ScrollBarAlwaysOff 1 QAbstractScrollArea從不顯示滾動條。 Qt::ScrollBarAlwaysOn 2 QAbstractScrollArea始終顯示一個滾動條。在具有瞬時滾動條的系統上(例如,在版本10.7的Mac上),此屬性被忽略。 -
sizeAdjustPolicy: SizeAdjustPolicy 當視口大小更改時滾動區域大小如何更改的策略
預設策略是QAbstractScrollArea::AdjustIgnored。更改此屬性實際上可能會調整滾動區域的大小。
Access functions:
- QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
- void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)
公共函式
構造和析構
- QAbstractScrollArea(QWidget *parent = nullptr)
- virtual ~QAbstractScrollArea()
屬性相關
- Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
- void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
- Qt::ScrollBarPolicy verticalScrollBarPolicy() const
- void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
- QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
- void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)
特殊
-
QWidget * cornerWidget() const
-
void setCornerWidget(QWidget *widget)
-
QScrollBar * horizontalScrollBar() const
-
void setHorizontalScrollBar(QScrollBar *scrollBar)
-
QScrollBar * verticalScrollBar() const
-
void setVerticalScrollBar(QScrollBar *scrollBar)
-
QWidget * viewport() const
-
void setViewport(QWidget *widget)
-
virtual void setupViewport(QWidget *viewport)
-
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)並將寬度設定為該值。 -
QWidgetList scrollBarWidgets(Qt::Alignment alignment)
-
QSize maximumViewportSize() const
重寫的公共函式
- virtual QSize minimumSizeHint() const override
- virtual QSize sizeHint() const override
受保護的函式
- virtual void scrollContentsBy(int dx, int dy)
- void setViewportMargins(int left, int top, int right, int bottom)
- void setViewportMargins(const QMargins &margins)
- virtual bool viewportEvent(QEvent *event)
- QMargins viewportMargins() const
- virtual QSize viewportSizeHint() const
重寫的受保護的函式
- virtual void contextMenuEvent(QContextMenuEvent *e) override
- virtual void dragEnterEvent(QDragEnterEvent *event) override
- virtual void dragLeaveEvent(QDragLeaveEvent *event) override
- virtual void dragMoveEvent(QDragMoveEvent *event) override
- virtual void dropEvent(QDropEvent *event) override
- virtual bool event(QEvent *event) override
- virtual void keyPressEvent(QKeyEvent *e) override
- virtual void mouseDoubleClickEvent(QMouseEvent *e) override
- virtual void mouseMoveEvent(QMouseEvent *e) override
- virtual void mousePressEvent(QMouseEvent *e) override
- virtual void mouseReleaseEvent(QMouseEvent *e) override
- virtual void paintEvent(QPaintEvent *event) override
- virtual void resizeEvent(QResizeEvent *event) override
- virtual void wheelEvent(QWheelEvent *e) override