QAbstractScrollArea Class
QAbstractScrollArea widget 提供了一个带有按需滚动条的滚动区域。更多
Header: | #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 widget。QAbstractScrollArea 的子类应实现 margins 功能。
继承 QAbstractScrollArea 时,需要执行以下操作:
- 通过设置滚动条的范围、值、页面步长和跟踪其移动来控制滚动条。
- 根据滚动条的值在视口中绘制区域内容。
- 在viewportEvent() 中处理视口接收到的事件--尤其是调整大小事件。
- 使用
viewport->update()
而不是update() 更新视口的内容,因为所有绘制操作都是在视口上进行的。
如果滚动条策略为Qt::ScrollBarAsNeeded (默认),QAbstractScrollArea 会在滚动条提供非零滚动范围时显示滚动条,否则就隐藏滚动条。
每当视口接收到调整大小事件或内容大小发生变化时,都应更新滚动条和视口。当滚动条的值发生变化时,视口也需要更新。滚动条的初始值通常是在区域接收到新内容时设置的。
我们举一个简单的例子,在这个例子中,我们实现了一个可以滚动任何QWidget 的滚动区域。我们将 widget 设为视口的子控件;这样,我们就无需计算要绘制 widget 的哪个部分,只需使用QWidget::move() 移动 widget 即可。当区域内容或视口大小发生变化时,我们会执行以下操作:
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在有意义的情况下,QAbstractScrollArea 的专门处理程序会重新映射到视口事件。重新映射的专门处理程序有paintEvent(),mousePressEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),mouseMoveEvent(),wheelEvent(),dragEnterEvent(),dragMoveEvent(),dragLeaveEvent(),dropEvent(),contextMenuEvent(), 和resizeEvent().
QScrollArea继承 QAbstractScrollArea 的 QAbstractScrollArea 为任何QWidget 提供平滑滚动(即逐像素滚动 widget)。只有当您需要更特殊的行为时,才需要子类化 QAbstractScrollArea。例如,如果整个区域的内容不适合绘制在QWidget 上,或者如果您不希望平滑滚动,就需要子类化 QAbstractScrollArea。
另请参阅 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() 隐藏 widget。
滚动条窗口小部件的大小将根据当前样式的滚动条几何形状进行调整。下面描述的是水平滚动条上的滚动条 widget 的情况:
窗口小部件的高度将设置为与滚动条的高度相匹配。要控制 widget 的宽度,请使用QWidget::setMinimumWidth 和QWidget::setMaximumWidth ,或执行QWidget::sizeHint() 并设置水平尺寸策略。如果您想要一个正方形的 widget,请调用QStyle::pixelMetric(QStyle::PM_ScrollBarExtent) 并将宽度设置为该值。
另请参阅 scrollBarWidgets() 。
[override virtual protected]
void QAbstractScrollArea::contextMenuEvent(QContextMenuEvent *e)
重实现:QWidget::contextMenuEvent(QContextMenuEvent *event)。
该事件处理程序可在子类中重新实现,以接收viewport() widget 的上下文菜单事件。事件在e 中传递。
另请参阅 QWidget::contextMenuEvent() 。
QWidget *QAbstractScrollArea::cornerWidget() const
返回两个滚动条之间角落的 widget。
默认情况下,不存在角落部件。
另请参见 setCornerWidget()。
[override virtual protected]
void QAbstractScrollArea::dragEnterEvent(QDragEnterEvent *event)
重实现:QWidget::dragEnterEvent(QDragEnterEvent *event)。
该事件处理程序可在子类中重新实现,以接收viewport() widget 的拖动输入事件(在event 中传递)。
另请参阅 QWidget::dragEnterEvent() 。
[override virtual protected]
void QAbstractScrollArea::dragLeaveEvent(QDragLeaveEvent *event)
重实现:QWidget::dragLeaveEvent(QDragLeaveEvent *event)。
该事件处理程序可在子类中重新实现,以接收viewport() widget 的拖动离开事件(在event 中传递)。
另请参阅 QWidget::dragLeaveEvent() 。
[override virtual protected]
void QAbstractScrollArea::dragMoveEvent(QDragMoveEvent *event)
重实现:QWidget::dragMoveEvent(QDragMoveEvent *event)。
该事件处理程序可在子类中重新实现,以接收viewport() widget 的拖动移动事件(在event 中传递)。
另请参阅 QWidget::dragMoveEvent() 。
[override virtual protected]
void QAbstractScrollArea::dropEvent(QDropEvent *event)
重实现:QWidget::dropEvent(QDropEvent *event)。
该事件处理程序可在子类中重新实现,以接收viewport() widget 的下拉事件(在event 中传递)。
另请参阅 QWidget::dropEvent().
[override virtual protected]
bool QAbstractScrollArea::event(QEvent *event)
重实现:QFrame::event(QEvent *e)。
这是QAbstractScrollArea widget(不是滚动区域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() widget 的鼠标双击事件。事件在e 中传递。
另请参阅 QWidget::mouseDoubleClickEvent() 。
[override virtual protected]
void QAbstractScrollArea::mouseMoveEvent(QMouseEvent *e)
重实现:QWidget::mouseMoveEvent(QMouseEvent *event).
该事件处理程序可在子类中重新实现,以接收viewport() widget 的鼠标移动事件。事件在e 中传递。
另请参阅 QWidget::mouseMoveEvent() 。
[override virtual protected]
void QAbstractScrollArea::mousePressEvent(QMouseEvent *e)
重实现:QWidget::mousePressEvent(QMouseEvent *event).
该事件处理程序可在子类中重新实现,以接收viewport() widget 的鼠标按下事件。事件在e 中传递。
默认实现调用QWidget::mousePressEvent() 进行默认弹出窗口处理。
另请参见 QWidget::mousePressEvent()。
[override virtual protected]
void QAbstractScrollArea::mouseReleaseEvent(QMouseEvent *e)
重实现:QWidget::mouseReleaseEvent(QMouseEvent *event).
该事件处理程序可在子类中重新实现,以接收viewport() widget 的鼠标释放事件。事件在e 中传递。
另请参阅 QWidget::mouseReleaseEvent() 。
[override virtual protected]
void QAbstractScrollArea::paintEvent(QPaintEvent *event)
重实现:QFrame::paintEvent(QPaintEvent *)。
该事件处理程序可在子类中重新实现,以接收viewport() widget 的绘画事件(在event 中传递)。
另请参阅 QWidget::paintEvent() 。
[override virtual protected]
void QAbstractScrollArea::resizeEvent(QResizeEvent *event)
重实现:QWidget::resizeEvent(QResizeEvent *event)。
该事件处理程序可在子类中重新实现,以接收viewport() widget 的调整大小事件(在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 设置为widget 。
您可能还想将至少一个滚动条模式设置为AlwaysOn
。
通过nullptr
时,角落里不会显示 widget。
之前的任何角落部件都会被隐藏。
您可以在不同的时间使用相同的 widget 调用 setCornerWidget()。
除非您在设置其他角落部件(或nullptr
)后单独重新指定该部件,否则此处设置的所有部件都将在滚动区域被销毁时被删除。
任何新设置的 Widget 当前都没有父级。
默认情况下,不存在角部件。
另请参阅 cornerWidget(),horizontalScrollBarPolicy, 和horizontalScrollBarPolicy 。
void QAbstractScrollArea::setHorizontalScrollBar(QScrollBar *scrollBar)
用scrollBar 替换现有的水平滚动条,并在新滚动条上设置前滚动条的所有滑块属性。然后删除原滚动条。
QAbstractScrollArea 默认情况下,ASP.NET 已经提供了水平和垂直滚动条。您可以调用该函数,用自己自定义的滚动条替换默认的水平滚动条。
另请参阅 horizontalScrollBar() 和setVerticalScrollBar()。
void QAbstractScrollArea::setVerticalScrollBar(QScrollBar *scrollBar)
用scrollBar 替换现有的垂直滚动条,并在新滚动条上设置前滚动条的所有滑块属性。然后删除原滚动条。
QAbstractScrollArea 默认情况下,ASP.NET 已经提供了垂直和水平滚动条。您可以调用该函数,用自己自定义的滚动条替换默认的垂直滚动条。
另请参阅 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 子类实现。此外,如果子类将用于项目视图,则不应调用此函数。
默认情况下,所有 margin 都为零。
另请参阅 viewportMargins() 。
[virtual]
void QAbstractScrollArea::setupViewport(QWidget *viewport)
QAbstractScrollArea 在调用setViewport(viewport) 后调用此槽。在QAbstractScrollArea 的子类中重新实现此函数,以便在使用新的viewport 之前对其进行初始化。
另请参阅 setViewport() 。
[override virtual]
QSize QAbstractScrollArea::sizeHint() const
重实现:QFrame::sizeHint() 常量。
返回滚动区域的 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() widget)的主事件处理程序。它处理指定的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() widget 的车轮事件。事件在e 中传递。
另请参阅 QWidget::wheelEvent() 。
© 2025 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.