QAbstractScrollArea 类

QAbstractScrollArea 小部件提供了一个带有按需滚动条的滚动区域。 更多...

头文件 #include <QAbstractScrollArea>
CMakefind_package.Qt6.REQUIRED.COMPONENTS.Widgets)
target_link_libraries(mytarget.PRIVATE.Qt6::Widgets)
qmakeQT += widgets
继承自 QFrame
继承

QAbstractItemView, QGraphicsView, QMdiArea, QPlainTextEdit, QScrollArea, and QTextEdit

公共类型

enumSizeAdjustPolicy { AdjustIgnored, AdjustToContents, AdjustToContentsOnFirstShow }

属性

公共函数

QAbstractScrollArea(QWidget *parent = nullptr)
virtual~QAbstractScrollArea()
voidaddScrollBarWidget(QWidget *widget, Qt::Alignment alignment)
QWidget *cornerWidget() const
QScrollBar *horizontalScrollBar() const
Qt::ScrollBarPolicyhorizontalScrollBarPolicy() const
QSizemaximumViewportSize() const
QWidgetListscrollBarWidgets(Qt::Alignment alignment)
voidsetCornerWidget(QWidget *widget)
voidsetHorizontalScrollBar(QScrollBar *scrollBar)
voidsetHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
voidsetSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)
voidsetVerticalScrollBar(QScrollBar *scrollBar)
voidsetVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
voidsetViewport(QWidget *widget)
virtual voidsetupViewport(QWidget *viewport)
QAbstractScrollArea::SizeAdjustPolicysizeAdjustPolicy() const
QScrollBar *verticalScrollBar() const
Qt::ScrollBarPolicyverticalScrollBarPolicy() const
QWidget *viewport() const

重写的公共函数

virtual QSizeminimumSizeHint() const override
virtual QSizesizeHint() const override

受保护的函数

virtual voidscrollContentsBy(int dx, int dy)
voidsetViewportMargins(int left, int top, int right, int bottom)
voidsetViewportMargins(const QMargins &margins)
virtual boolviewportEvent(QEvent *event)
QMarginsviewportMargins() const
virtual QSizeviewportSizeHint() const

重写的受保护函数

virtual voidcontextMenuEvent(QContextMenuEvent *e) override
virtual voiddragEnterEvent(QDragEnterEvent *event) override
virtual voiddragLeaveEvent(QDragLeaveEvent *event) override
virtual voiddragMoveEvent(QDragMoveEvent *event) override
virtual voiddropEvent(QDropEvent *event) override
virtual boolevent(QEvent *event) override
virtual voidkeyPressEvent(QKeyEvent *e) override
virtual voidmouseDoubleClickEvent(QMouseEvent *e) override
virtual voidmouseMoveEvent(QMouseEvent *e) override
virtual voidmousePressEvent(QMouseEvent *e) override
virtual voidmouseReleaseEvent(QMouseEvent *e) override
virtual voidpaintEvent(QPaintEvent *event) override
virtual voidresizeEvent(QResizeEvent *event) override
virtual voidwheelEvent(QWheelEvent *e) override

详细描述

QAbstractScrollArea 是一个滚动区域的低级抽象。该区域提供了一个中央小部件称为视口,在其中可以滚动区域的内容(即,内容可见部分的渲染在视口中)。

视口旁边是一个垂直滚动条,下面是一个水平滚动条。当所有区域内容都适合视口中,每个滚动条都可以根据滚动条的 Qt::ScrollBarPolicy 设置为可见或隐藏。当滚动条隐藏时,视口扩展以覆盖所有可用空间。当滚动条再次可见时,视口收缩以留出空间放置滚动条。

可以在视口周围预留一个边距区域,见 setViewportMargins。此功能主要用来在滚动区域上方或旁边放置一个 QHeaderView 小部件。QAbstractScrollArea 的子类应该实现边距。

继承 QAbstractScrollArea 时,需要执行以下操作

  • 通过设置范围、值、页面步长并跟踪其移动来控制滚动条。
  • 根据滚动条的值在视口中绘制区域的内容。
  • viewportEvent() 中处理视口接收的事件 - 尤其是尺寸事件。
  • 使用 viewport->update() 代替 update() 来更新视口的内容,因为所有绘图操作都在视口中进行。

具有Qt::ScrollBarAsNeeded(默认值)的滚动条策略,当滚动条提供非零滚动范围时,QAbstractScrollArea会显示滚动条;否则隐藏它们。

当视口接收到调整大小事件或内容大小发生变化时,应更新滚动条和视口。当滚动条的值发生变化时,也需要更新视口。滚动条的初始值通常在区域接收到新内容时设置。

我们提供了一个简单的示例,在这个示例中,我们实现了一个可以滚动任何QWidget的滚动区域。我们将小部件视为视口的子项;这样,我们就不必计算要绘制的 widgets 的哪一部分,而只需简单地使用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();

当滚动条的值发生变化时,我们需要更新 widgets 的位置,即找到视图中要绘制的 widgets 的部分

    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提供了平滑滚动(即,widget 按像素滚动)。只有在你需要更专业的行为时才需要子类化 QAbstractScrollArea。例如,当整个区域的内容不适合在 QWidget 上绘制,或者您不需要平滑滚动时,这将是真的。

另请参阅QScrollArea

成员类型文档

enum QAbstractScrollArea::SizeAdjustPolicy

此枚举指定当视口大小发生变化时,QAbstractScrollArea的大小提示应如何调整。

常量描述
QAbstractScrollArea::AdjustIgnored0滚动区域将像以前一样行为 - 不进行任何调整。
QAbstractScrollArea::AdjustToContents2滚动区域将始终调整到视口。
QAbstractScrollArea::AdjustToContentsOnFirstShow1滚动区域将在第一次显示时调整到其视口。

属性文档

horizontalScrollBarPolicy : Qt::ScrollBarPolicy

此属性包含水平滚动条的策略。

默认策略是 Qt::ScrollBarAsNeeded

访问函数

Qt::ScrollBarPolicyhorizontalScrollBarPolicy() const
voidsetHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)

另请参阅verticalScrollBarPolicy

sizeAdjustPolicy : SizeAdjustPolicy

此属性持有关scroll area大小如何随viewport大小变化而更改的策略。

默认策略是 QAbstractScrollArea::AdjustIgnored。更改此属性实际上可能调整scrollarea大小。

访问函数

QAbstractScrollArea::SizeAdjustPolicysizeAdjustPolicy() const
voidsetSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)

verticalScrollBarPolicy : Qt::ScrollBarPolicy

此属性持有关垂直滚动条的策略。

默认策略是 Qt::ScrollBarAsNeeded

访问函数

Qt::ScrollBarPolicyverticalScrollBarPolicy() const
voidsetVerticalScrollBarPolicy(Qt::ScrollBarPolicy)

另请参阅horizontalScrollBarPolicy

成员函数文档

[明确] QAbstractScrollArea::QAbstractScrollArea(QWidget *parent = nullptr)

构建一个viewport。

parent 参数会发送到 QWidget 构造函数。

[虚 noexcept] QAbstractScrollArea::~QAbstractScrollArea()

销毁viewport。

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

widget 添加为位于由 alignment 指定的位置的滚动条控件。

滚动条控件显示在水平或垂直滚动条旁边,并可以放置在它的任何一侧。如果您希望滚动条控件始终可见,请将相应滚动条的 scrollBarPolicy 设置为 AlwaysOn

alignment 必须是 Qt::Alignleft 和 Qt::AlignRight 之一,这映射到水平滚动条,或者 Qt::AlignTopQt::AlignBottom,这映射到垂直滚动条。

可以通过重新排列小部件或删除小部件来移除滚动条控件。还可以使用 QWidget::hide() 隐藏控件。

滚动条控件将调整大小以适合当前样式下的滚动条几何形状。以下描述了水平滚动条上的滚动条控件的情况

小部件的高度将设置为与滚动条高度匹配。要控制小部件的宽度,请使用 QWidget::setMinimumWidthQWidget::setMaximumWidth,或实现 QWidget::sizeHint() 并设置一个水平大小策略。如果您要一个正方形的小部件,请调用 QStyle::pixelMetric(QStyle::PM_ScrollBarExtent) 并将宽度设置为该值。

另请参阅scrollBarWidgets

[重写虚受保护] void QAbstractScrollArea::contextMenuEvent(QContextMenuEvent *e)

重实现: QWidget::contextMenuEvent(QContextMenuEvent *event)。

此事件处理程序可以在子类中重写,以接收viewport()小部件的上下文菜单事件。事件通过e传递。

另请参阅 QWidget::contextMenuEvent

QWidget *QAbstractScrollArea::cornerWidget() const

返回两个滚动条之间的角落中的小部件。

默认情况下,没有角落小部件。

另请参阅 setCornerWidget

[重写虚保护] void QAbstractScrollArea::dragEnterEvent(QDragEnterEvent *event)

重实现: QWidget::dragEnterEvent(QDragEnterEvent *event)

此事件处理程序可以在子类中重写,以接收viewport()小部件的拖入事件(通过event传递)。

另请参阅 QWidget::dragEnterEvent

[重写虚保护] void QAbstractScrollArea::dragLeaveEvent(QDragLeaveEvent *event)

重实现: QWidget::dragLeaveEvent(QDragLeaveEvent *event)

此事件处理程序可以在子类中重写,以接收viewport()小部件的拖出事件(通过event传递)。

另请参阅 QWidget::dragLeaveEvent

[重写虚保护] void QAbstractScrollArea::dragMoveEvent(QDragMoveEvent *event)

重实现: QWidget::dragMoveEvent(QDragMoveEvent *event)

此事件处理程序可以在子类中重写,以接收viewport()小部件的拖动事件(通过event传递)。

另请参阅 QWidget::dragMoveEvent

[重写虚保护] void QAbstractScrollArea::dropEvent(QDropEvent *event)

重实现: QWidget::dropEvent(QDropEvent *event)

此事件处理程序可以在子类中重写,以接收viewport()小部件的放下事件(通过event传递)。

另请参阅 QWidget::dropEvent

[重写虚保护] bool QAbstractScrollArea::event(QEvent *event)

重实现: QFrame::event(QEvent *e)

这是QAbstractScrollArea小部件(不是滚动区域viewport)的主要事件处理程序。指定的e是通用事件对象,可能需要根据它的类型转换为相应的类。

另请参阅 QEvent::type

QScrollBar *QAbstractScrollArea::horizontalScrollBar() const

返回水平滚动条。

另请参阅setHorizontalScrollBar(),horizontalScrollBarPolicyverticalScrollBar

[重写虚保护] void QAbstractScrollArea::keyPressEvent(QKeyEvent *e)

重写: QWidget::keyPressEvent(QKeyEvent *event).

当按键时,该函数会被调用,携带按键事件 e。它处理 PageUp,PageDown,上,下,左和右按键,其他所有按键被忽略。

QSize QAbstractScrollArea::maximumViewportSize() const

返回视口的大小,就像滚动条没有有效的滚动范围一样。

[重写虚] QSize QAbstractScrollArea::minimumSizeHint() const

重写访问属性:QWidget::minimumSizeHint.

[重写虚保护] void QAbstractScrollArea::mouseDoubleClickEvent(QMouseEvent *e)

重写:QWidget::mouseDoubleClickEvent(QMouseEvent *event).

这个事件处理程序可以被子类重写以接收 viewport() 小部件的鼠标双击事件。事件通过 e 传递。

另请参阅QWidget::mouseDoubleClickEvent

[重写虚保护] void QAbstractScrollArea::mouseMoveEvent(QMouseEvent *e)

重写:QWidget::mouseMoveEvent(QMouseEvent *event).

这个事件处理程序可以被子类重写以接收 viewport() 小部件的鼠标移动事件。事件通过 e 传递。

另请参阅QWidget::mouseMoveEvent

[重写虚保护] void QAbstractScrollArea::mousePressEvent(QMouseEvent *e)

重写:QWidget::mousePressEvent(QMouseEvent *event).

这个事件处理程序可以被子类重写以接收 viewport() 小部件的鼠标按下事件。事件通过 e 传递。

默认实现调用 QWidget::mousePressEvent() 以处理默认弹出。

另请参阅QWidget::mousePressEvent

[重写虚保护] void QAbstractScrollArea::mouseReleaseEvent(QMouseEvent *e)

重写:QWidget::mouseReleaseEvent(QMouseEvent *event).

这个事件处理程序可以被子类重写以接收 viewport() 小部件的鼠标释放事件。事件通过 e 传递。

另请参阅QWidget::mouseReleaseEvent

[重写虚受保护] void QAbstractScrollArea::paintEvent(QPaintEvent *event)

重写了: QFrame::paintEvent(QPaintEvent *).

此事件处理函数可以在子类中重写,用于接收(通过 event 传入)viewport() 小部件的绘制事件。

注意: 如果你创建了一个 QPainter,它必须在 viewport() 上操作。

另请参阅 QWidget::paintEvent

[重写虚受保护] void QAbstractScrollArea::resizeEvent(QResizeEvent *event)

重写了: QWidget::resizeEvent(QResizeEvent *event).

此事件处理函数可以在子类中重写,用于接收(通过 event 传入)viewport() 小部件的调整大小事件。

当调用 resizeEvent() 时,viewport 已经具有了新的几何形状:其新大小可以通过 QResizeEvent::size() 函数访问,旧大小通过 QResizeEvent::oldSize() 访问。

另请参阅 QWidget::resizeEvent

QWidgetList QAbstractScrollArea::scrollBarWidgets(Qt::Alignment alignment)

返回当前设置的滚动条小部件的列表。alignment 可以是四个位置标记的组合中的任意组合。

另请参阅 addScrollBarWidget

[虚受保护] void QAbstractScrollArea::scrollContentsBy(int dx, int dy)

当滚动条移动了 dxdy 时,将调用此虚拟处理程序,并且viewport的内容应该相应地滚动。

默认实现简单地在整个 viewport 上调用 update(),子类可以根据优化目的重写此处理程序,或者像 QScrollArea 一样移动内容小部件。参数 dxdy 是为了方便而设置的,以便该类知道应该滚动多少(例如,在执行像素移动时很有用)。你也可以忽略这些值,直接滚动到滚动条所指示的位置。

progamatically调用此函数以进行滚动是错误的,应使用滚动条而不是(例如,通过直接调用QScrollBar::setValue()).

void QAbstractScrollArea::setCornerWidget(QWidget *widget)

设置在两个滚动条之间角的部件为 widget

你可能还会想将至少一个滚动条模式设置为 AlwaysOn

传递 nullptr 表示在角落中不显示任何小部件。

任何先前的角落小部件都将被隐藏。

你可以多次用相同的部件调用 setCornerWidget()。

当你设置另一个角落小部件或传递 nullptr 后,scroll area 会删除在这里设置的任何小部件(除非你在设置其他角落小部件后单独将小部件重新设置为父控件)。

任何新设置的小部件不应有任何当前父控件。

默认情况下,没有角落小部件。

另请参阅 cornerWidget(),horizontalScrollBarPolicy 以及 horizontalScrollBarPolicy

void QAbstractScrollArea::setHorizontalScrollBar(QScrollBar *scrollBar)

scrollBar 替换现有的水平滚动条,并将之前滚动条的滑块属性设置到新滚动条上。然后删除之前的滚动条。

QAbstractScrollArea 默认已提供水平和垂直滚动条。您可以通过调用此函数将默认水平滚动条替换为您自定义的滚动条。

另请参阅 horizontalScrollBar() 和 setVerticalScrollBar()。

void QAbstractScrollArea::setVerticalScrollBar(QScrollBar *scrollBar)

scrollBar 替换现有的垂直滚动条,并将之前滚动条的滑块属性设置到新滚动条上。然后删除之前的滚动条。

QAbstractScrollArea 默认已提供水平和垂直滚动条。您可以通过调用此函数将默认垂直滚动条替换为您自定义的滚动条。

另请参阅 verticalScrollBar() 和 setHorizontalScrollBar

void QAbstractScrollArea::setViewport(QWidget *widget)

将视口设置为指定的 widgetQAbstractScrollArea 将获取给定 widget 的所有权。

如果 widgetnullptrQAbstractScrollArea 将为视口分配一个新的 QWidget 实例。

另请参阅 viewport

[protected] void QAbstractScrollArea::setViewportMargins(int left, int top, int right, int bottom)

将滚动区域周围的边距设置为 lefttoprightbottom。这对于像有“锁定”行和列的电子表格等应用程序很有用。留出空白的空间用于未用的区域,并将小部件放在未用区域中。

请注意,此函数通常由 QTreeViewQTableView 调用,因此 QAbstractScrollArea 子类必须实现边距。此外,如果子类要用于项目视图,则不应调用此函数。

默认情况下,所有边距都是零。

另请参阅 viewportMargins

[protected] void QAbstractScrollArea::setViewportMargins(const QMargins &margins)

设置滚动区域的 margins。这对于像有“锁定”行和列的电子表格等应用程序很有用。留出空白的空间用于未用的区域,并将小部件放在未用区域中。

默认情况下,所有边距都是零。

另请参阅 viewportMargins

[虚拟] void QAbstractScrollArea::setupViewport(QWidget *viewport)

此槽函数在调用 QAbstractScrollAreasetViewport(viewport) 后被调用。在 QAbstractScrollArea 的子类中重新实现此函数,以便在使用之前初始化新的 viewport

另请参阅setViewport

[重写虚函数] QSize QAbstractScrollArea::sizeHint() const

重写: QFrame::sizeHint() const.

返回滚动区域的 sizeHint 属性。大小由使用 viewportSizeHint() 加上为滚动条保留的额外空间(如有必要)来确定。

QScrollBar *QAbstractScrollArea::verticalScrollBar() const

返回垂直滚动条。

另请参阅setVerticalScrollBar(),verticalScrollBarPolicyhorizontalScrollBar()。

QWidget *QAbstractScrollArea::viewport() const

返回视口小部件。

使用 QScrollArea::widget() 函数检索视口小部件的内容。

另请参阅setViewport() 和 QScrollArea::widget()。

[虚拟受保护] bool QAbstractScrollArea::viewportEvent(QEvent *event)

滚动区域的 主事件处理器(viewport() 小部件)。它处理指定的 event,可以由子类调用以提供合理的基本行为。

返回 true 以指示事件系统该事件已被处理,无需进一步处理;否则返回 false 以指示事件应进一步传播。

您可以在子类中重新实现此函数,但建议使用专业的事件处理器之一。

视口事件的专业处理程序包括:paintEvent(),mousePressEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),mouseMoveEvent(),wheelEvent(),dragEnterEvent(),dragMoveEvent(),dragLeaveEvent(),dropEvent(),contextMenuEventresizeEvent()。

[受保护] QMargins QAbstractScrollArea::viewportMargins() const

返回滚动区域的边缘。默认情况下,所有边缘都是零。

另请参阅setViewportMargins

[虚保护] QSize QAbstractScrollArea::viewportSizeHint() const

返回视口推荐的尺寸。默认实现返回 viewport() -> sizeHint()。注意,此尺寸仅为视口尺寸,无任何滚动条可见。

[重载虚拟保护] void QAbstractScrollArea::wheelEvent(QWheelEvent *e)

重实现:QWidget::wheelEvent(QWheelEvent *event)。

此事件处理器可以在子类中重实现,以接收 viewport() 小部件的轮事件。事件通过 e 传入。

另请参阅QWidget::wheelEvent

© 2024 Qt公司。此处包含的文档贡献属于各自的版权所有者。本提供的文档按照自由软件基金会发布的GNU自由文档许可证版本1.3的条款进行许可。Qt及其相关标志是芬兰及其它国家的Qt公司商标。所有其他商标均为其各自的产权所有。