QAbstractScrollArea Class
QAbstractScrollArea 控件提供了一个带有按需显示滚动条的滚动区域。更多内容...
| 标题: | #include <QAbstractScrollArea> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 继承自: | QFrame |
| 被继承方: | QAbstractItemView、QGraphicsView 、QMdiArea 、QPlainTextEdit 、QScrollArea ,以及QTextEdit |
公共类型
| enum | SizeAdjustPolicy { AdjustIgnored, AdjustToContents, AdjustToContentsOnFirstShow } |
属性
- horizontalScrollBarPolicy : Qt::ScrollBarPolicy
- sizeAdjustPolicy : SizeAdjustPolicy
- verticalScrollBarPolicy : Qt::ScrollBarPolicy
公共函数
| QAbstractScrollArea(QWidget *parent = nullptr) | |
| virtual | ~QAbstractScrollArea() |
| void | addScrollBarWidget(QWidget *widget, Qt::Alignment alignment) |
| QWidget * | cornerWidget() const |
| QScrollBar * | horizontalScrollBar() const |
| Qt::ScrollBarPolicy | horizontalScrollBarPolicy() const |
| QSize | maximumViewportSize() const |
| QWidgetList | scrollBarWidgets(Qt::Alignment alignment) |
| void | setCornerWidget(QWidget *widget) |
| void | setHorizontalScrollBar(QScrollBar *scrollBar) |
| void | setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy) |
| void | setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy) |
| void | setVerticalScrollBar(QScrollBar *scrollBar) |
| void | setVerticalScrollBarPolicy(Qt::ScrollBarPolicy) |
| void | setViewport(QWidget *widget) |
| virtual void | setupViewport(QWidget *viewport) |
| QAbstractScrollArea::SizeAdjustPolicy | sizeAdjustPolicy() const |
| QScrollBar * | verticalScrollBar() const |
| Qt::ScrollBarPolicy | verticalScrollBarPolicy() const |
| QWidget * | viewport() const |
重新实现的公共函数
| virtual QSize | minimumSizeHint() const override |
| virtual QSize | sizeHint() const override |
受保护函数
| virtual void | scrollContentsBy(int dx, int dy) |
| void | setViewportMargins(const QMargins &margins) |
| void | setViewportMargins(int left, int top, int right, int bottom) |
| 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 |
详细说明
QAbstractScrollArea 是滚动区域的一种低级抽象。该区域提供了一个称为“视口”的中心小部件,区域的内容将在其中进行滚动(即,内容的可见部分将在视口中渲染)。
视口旁边是一个垂直滚动条,下方是一个水平滚动条。 当区域内的所有内容都能完全显示在视口内时,每个滚动条的可见与否取决于其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 会在虚拟函数viewportEvent() 的处理程序中提供所有视口事件。在合理的情况下,QWidget 的特化处理程序会被重映射为视口事件。 被重新映射的专用处理程序包括:paintEvent()、mousePressEvent()、mouseReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent()、wheelEvent()、dragEnterEvent()、dragMoveEvent()、dragLeaveEvent()、dropEvent()、contextMenuEvent() 以及resizeEvent()。
QScrollArea该类继承自 QAbstractScrollArea,可为任何QWidget 提供平滑滚动(即控件以像素为单位逐帧滚动)。 只有当需要更特殊的行为时,才需要继承 QAbstractScrollArea。例如,当该区域的全部内容不适合在QWidget 上绘制,或者您不希望实现平滑滚动时,就属于这种情况。
另请参阅 QScrollArea 。
成员类型文档
enum QAbstractScrollArea::SizeAdjustPolicy
此枚举指定当视口大小发生变化时,QAbstractScrollArea 的大小提示应如何调整。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractScrollArea::AdjustIgnored | 0 | 滚动区域将保持原有的行为——不进行任何调整。 |
QAbstractScrollArea::AdjustToContents | 2 | 滚动区域将始终根据视口进行调整 |
QAbstractScrollArea::AdjustToContentsOnFirstShow | 1 | 滚动区域在首次显示时会根据其视口进行调整。 |
属性文档
horizontalScrollBarPolicy : Qt::ScrollBarPolicy
该属性用于设置水平滚动条的样式
默认策略为Qt::ScrollBarAsNeeded 。
访问函数:
| Qt::ScrollBarPolicy | horizontalScrollBarPolicy() const |
| void | setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy) |
另请参阅 verticalScrollBarPolicy 。
sizeAdjustPolicy : SizeAdjustPolicy
该属性存储了描述当视口大小发生变化时,滚动区域大小如何变化的策略。
默认策略为QAbstractScrollArea::AdjustIgnored 。修改此属性可能会实际调整滚动区域的大小。
访问函数:
| QAbstractScrollArea::SizeAdjustPolicy | sizeAdjustPolicy() const |
| void | setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy) |
verticalScrollBarPolicy : Qt::ScrollBarPolicy
该属性用于设置垂直滚动条的样式
默认策略为Qt::ScrollBarAsNeeded 。
访问函数:
| Qt::ScrollBarPolicy | verticalScrollBarPolicy() const |
| void | setVerticalScrollBarPolicy(Qt::ScrollBarPolicy) |
另请参阅 horizontalScrollBarPolicy 。
成员函数文档
[explicit] QAbstractScrollArea::QAbstractScrollArea(QWidget *parent = nullptr)
构建一个视口。
parent 参数将传递给QWidget 构造函数。
[virtual noexcept] QAbstractScrollArea::~QAbstractScrollArea()
销毁视口。
void QAbstractScrollArea::addScrollBarWidget(QWidget *widget, Qt::Alignment alignment)
在alignment 指定的位置添加widget 作为滚动条控件。
滚动条控件显示在水平或垂直滚动条旁边,可放置在滚动条的任一侧。若要使滚动条控件始终可见,请将相应滚动条的 scrollBarPolicy 设置为AlwaysOn 。
alignment 该值必须为 Qt::Alignleft 或Qt::AlignRight (映射到水平滚动条),或Qt::AlignTop 及Qt::AlignBottom (映射到垂直滚动条)。
可以通过重新设置小部件的父对象或直接删除它来移除滚动条小部件。此外,还可以通过调用 `QWidget::hide()` 来隐藏小部件。
滚动条控件将根据当前样式的滚动条几何形状进行调整大小。以下描述了水平滚动条上滚动条控件的情况:
控件的高度将设置为与滚动条的高度一致。要控制控件的宽度,请使用QWidget::setMinimumWidth 和QWidget::setMaximumWidth ,或实现QWidget::sizeHint()并设置水平尺寸策略。若需创建正方形控件,请调用QStyle::pixelMetric(QStyle::PM_ScrollBarExtent)并将宽度设置为该值。
另请参阅 scrollBarWidgets()。
[override virtual protected] void QAbstractScrollArea::contextMenuEvent(QContextMenuEvent *e)
重写:QWidget::contextMenuEvent(QContextMenuEvent *event)。
子类可以重写此事件处理程序,以接收针对viewport()控件的上下文菜单事件。该事件通过e 传递进来。
另请参阅 QWidget::contextMenuEvent()。
QWidget *QAbstractScrollArea::cornerWidget() const
返回位于两个滚动条之间的角落处的控件。
默认情况下,该位置不存在角控件。
另请参阅 setCornerWidget()。
[override virtual protected] void QAbstractScrollArea::dragEnterEvent(QDragEnterEvent *event)
重写:QWidget::dragEnterEvent (QDragEnterEvent *event)。
可以在子类中重写此事件处理程序,以接收针对 `viewport()` 控件的拖动进入事件(通过 `event` 传递)。
另请参阅 QWidget::dragEnterEvent()。
[override virtual protected] void QAbstractScrollArea::dragLeaveEvent(QDragLeaveEvent *event)
重写:QWidget::dragLeaveEvent(QDragLeaveEvent *event)。
子类可以重写此事件处理程序,以接收viewport() 控件的拖动离开事件(通过event 传递)。
另请参阅 QWidget::dragLeaveEvent()。
[override virtual protected] void QAbstractScrollArea::dragMoveEvent(QDragMoveEvent *event)
重写:QWidget::dragMoveEvent(QDragMoveEvent *event)。
可以在子类中重写此事件处理程序,以接收针对viewport()控件的拖动移动事件(通过event 传递)。
另请参阅 QWidget::dragMoveEvent()。
[override virtual protected] void QAbstractScrollArea::dropEvent(QDropEvent *event)
重写:QWidget::dropEvent(QDropEvent *event)。
可以在子类中重写此事件处理程序,以接收viewport() 控件的拖放事件(通过event 传递)。
另请参阅 QWidget::dropEvent()。
[override virtual protected] bool QAbstractScrollArea::event(QEvent *event)
重写自:QFrame::event(QEvent *e)。
这是QAbstractScrollArea 控件的主要事件处理函数(而非滚动区域viewport())。指定的event 是一个通用事件对象,可能需要根据其类型将其强制转换为相应的类。
另请参阅 QEvent::type()。
QScrollBar *QAbstractScrollArea::horizontalScrollBar() const
返回水平滚动条。
另请参阅 setHorizontalScrollBar()、horizontalScrollBarPolicy 以及verticalScrollBar()。
[override virtual protected] void QAbstractScrollArea::keyPressEvent(QKeyEvent *e)
重写:QWidget::keyPressEvent(QKeyEvent *event)。
当发生按键事件时,会调用该函数,其参数为e 。该函数处理PageUp、PageDown、Up、Down、Left和Right按键,并忽略所有其他按键操作。
QSize QAbstractScrollArea::maximumViewportSize() const
返回视口的大小,如同滚动条没有有效的滚动范围一样。
[override virtual] QSize QAbstractScrollArea::minimumSizeHint() const
重新实现了属性QWidget::minimumSizeHint 的访问函数。
[override virtual protected] void QAbstractScrollArea::mouseDoubleClickEvent(QMouseEvent *e)
重写:QWidget::mouseDoubleClickEvent(QMouseEvent *event)。
可以在子类中重写此事件处理程序,以接收针对viewport()控件的鼠标双击事件。该事件通过e 参数传递进来。
另请参阅 QWidget::mouseDoubleClickEvent()。
[override virtual protected] void QAbstractScrollArea::mouseMoveEvent(QMouseEvent *e)
重写自:QWidget::mouseMoveEvent(QMouseEvent *event)。
可以在子类中重写此事件处理程序,以接收viewport()控件的鼠标移动事件。该事件通过e 参数传递进来。
另请参阅 QWidget::mouseMoveEvent()。
[override virtual protected] void QAbstractScrollArea::mousePressEvent(QMouseEvent *e)
重写自:QWidget::mousePressEvent(QMouseEvent *event)。
子类可以重写此事件处理程序,以接收viewport()控件的鼠标按下事件。该事件通过e 参数传递进来。
默认实现会调用QWidget::mousePressEvent() 来处理默认的弹出菜单。
另请参阅 QWidget::mousePressEvent()。
[override virtual protected] void QAbstractScrollArea::mouseReleaseEvent(QMouseEvent *e)
重写自:QWidget::mouseReleaseEvent(QMouseEvent *event)。
子类可以重写此事件处理程序,以接收viewport()控件的鼠标释放事件。该事件通过e 参数传递进来。
另请参阅 QWidget::mouseReleaseEvent()。
[override virtual protected] void QAbstractScrollArea::paintEvent(QPaintEvent *event)
重写:QFrame::paintEvent (QPaintEvent *)。
可以在子类中重写此事件处理程序,以接收针对viewport()控件的绘制事件(通过event 传递)。
另请参阅 QWidget::paintEvent()。
[override virtual protected] void QAbstractScrollArea::resizeEvent(QResizeEvent *event)
重写:QWidget::resizeEvent(QResizeEvent *event)。
子类可以重写此事件处理程序,以接收针对viewport() 控件的调整大小事件(通过event 传递)。
当调用 resizeEvent() 时,视口已具有新的几何形状:可通过QResizeEvent::size() 函数获取其新尺寸,并通过QResizeEvent::oldSize() 获取旧尺寸。
另请参阅 QWidget::resizeEvent()。
QWidgetList QAbstractScrollArea::scrollBarWidgets(Qt::Alignment alignment)
返回当前设置的滚动条控件列表。alignment 可以是这四个位置标志的任意组合。
另请参阅 addScrollBarWidget()。
[virtual protected] void QAbstractScrollArea::scrollContentsBy(int dx, int dy)
当通过 `dx`、`dy` 移动滚动条时,会调用此虚拟处理程序,从而相应地滚动视口的内容。
默认实现仅对整个viewport() 调用update();子类可以为了优化目的重写此处理程序,或者——如QScrollArea 所示——用于移动内容小部件。参数dx 和dy 仅为方便起见,以便类知道应滚动多少距离(例如在进行像素级偏移时非常有用)。 您也可以忽略这些值,直接滚动到滚动条所指示的位置。
调用此函数以实现程序化滚动属于错误操作,请改用滚动条(例如直接调用QScrollBar::setValue())。
void QAbstractScrollArea::setCornerWidget(QWidget *widget)
将位于两个滚动条之间的角上的控件设置为widget 。
您可能还希望将至少一个滚动条模式设置为AlwaysOn 。
传递nullptr 参数时,角落处不会显示任何控件。
之前设置的任何角控件都会被隐藏。
您可以在不同时间调用 setCornerWidget() 并传入相同的控件。
除非在设置其他角控件(或nullptr )后单独为该控件重新指定父控件,否则在此处设置的所有控件都将在滚动区域被销毁时被删除。
任何新设置的小部件都不应具有当前父级。
默认情况下,不存在任何角落控件。
另请参阅 cornerWidget() 和horizontalScrollBarPolicy 。
void QAbstractScrollArea::setHorizontalScrollBar(QScrollBar *scrollBar)
将现有的水平滚动条替换为scrollBar ,并将原滚动条的所有滑块属性设置到新滚动条上。随后,原滚动条将被删除。
QAbstractScrollArea 默认情况下,已提供水平和垂直滚动条。您可以调用此函数,将默认的水平滚动条替换为您自定义的滚动条。
另请参阅 horizontalScrollBar() 和setVerticalScrollBar()。
void QAbstractScrollArea::setVerticalScrollBar(QScrollBar *scrollBar)
将现有的垂直滚动条替换为scrollBar ,并将原滚动条的所有滑块属性设置到新滚动条上。随后,原滚动条将被删除。
QAbstractScrollArea 默认情况下,已提供垂直和水平滚动条。您可以调用此函数,将默认的垂直滚动条替换为您自定义的滚动条。
另请参阅 verticalScrollBar() 和setHorizontalScrollBar()。
void QAbstractScrollArea::setViewport(QWidget *widget)
将视口设置为给定的widget 。QAbstractScrollArea 将接管给定的widget 。
如果widget 是nullptr ,则QAbstractScrollArea 将为视口分配一个新的QWidget 实例。
另请参阅 viewport()。
[protected] void QAbstractScrollArea::setViewportMargins(const QMargins &margins)
在滚动区域周围设置margins 。这对于电子表格等包含“锁定”行和列的应用程序非常有用。边缘区域留白;请将控件放置在未使用的区域中。
默认情况下,所有边距均为零。
另请参阅 viewportMargins()。
[protected] void QAbstractScrollArea::setViewportMargins(int left, int top, int right, int bottom)
将滚动区域周围的边距分别设置为left 、top 、right 和bottom 。这对于具有“锁定”行和列的电子表格等应用程序非常有用。边距区域保持空白;请将控件放置在未使用的区域中。
请注意,QTreeView 和QTableView 经常会调用此函数,因此边距必须由QAbstractScrollArea 的子类来实现。此外,如果子类要在项目视图中使用,则不应调用此函数。
默认情况下,所有边距均为零。
另请参阅 viewportMargins()。
[virtual] void QAbstractScrollArea::setupViewport(QWidget *viewport)
在调用setViewport (viewport )之后,QAbstractScrollArea 会调用此插槽。请在QAbstractScrollArea 的子类中重写此函数,以便在使用新的viewport 之前对其进行初始化。
另请参阅 setViewport()。
[override virtual] QSize QAbstractScrollArea::sizeHint() const
重写了:QFrame::sizeHint() const。
返回滚动区域的 sizeHint 属性。该大小由viewportSizeHint() 确定,并在必要时为滚动条预留额外空间。
QScrollBar *QAbstractScrollArea::verticalScrollBar() const
返回垂直滚动条。
另请参阅 setVerticalScrollBar()、verticalScrollBarPolicy 以及horizontalScrollBar()。
QWidget *QAbstractScrollArea::viewport() const
返回视口控件。
使用 `QScrollArea::widget()` 函数可获取视口小部件的内容。
另请参阅 setViewport() 和QScrollArea::widget()。
[virtual protected] bool QAbstractScrollArea::viewportEvent(QEvent *event)
滚动区域(viewport() 控件)的主要事件处理程序。它处理指定的event ,子类可以调用该方法以提供合理的默认行为。
返回true 以告知事件系统该事件已得到处理,无需进一步处理;否则返回false 以指示该事件应继续传播。
您可以在子类中重写此函数,但我们建议改用专门的事件处理程序之一。
视口事件的专用处理程序包括:paintEvent()、mousePressEvent()、mouseReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent()、wheelEvent()、dragEnterEvent()、dragMoveEvent()、dragLeaveEvent()、dropEvent()、contextMenuEvent(),以及resizeEvent()。
[protected] QMargins QAbstractScrollArea::viewportMargins() const
返回滚动区域周围的边距。默认情况下,所有边距均为零。
另请参阅 setViewportMargins()。
[virtual protected] QSize QAbstractScrollArea::viewportSizeHint() const
返回视口的建议尺寸。默认实现返回viewport()->sizeHint()。请注意,该尺寸仅为视口的实际尺寸,不包含任何可见的滚动条。
[override virtual protected] void QAbstractScrollArea::wheelEvent(QWheelEvent *e)
重写:QWidget::wheelEvent(QWheelEvent *event)。
可以在子类中重写此事件处理程序,以接收viewport()控件的滚轮事件。该事件通过e 传递进来。
另请参阅 QWidget::wheelEvent()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.