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