QAbstractScrollArea 类
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, and 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(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 |
详细描述
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::AdjustIgnored | 0 | 滚动区域将像以前一样行为 - 不进行任何调整。 |
QAbstractScrollArea::AdjustToContents | 2 | 滚动区域将始终调整到视口。 |
QAbstractScrollArea::AdjustToContentsOnFirstShow | 1 | 滚动区域将在第一次显示时调整到其视口。 |
属性文档
horizontalScrollBarPolicy : Qt::ScrollBarPolicy
此属性包含水平滚动条的策略。
默认策略是 Qt::ScrollBarAsNeeded。
访问函数
Qt::ScrollBarPolicy | horizontalScrollBarPolicy() const |
void | setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy) |
sizeAdjustPolicy : SizeAdjustPolicy
此属性持有关scroll area大小如何随viewport大小变化而更改的策略。
默认策略是 QAbstractScrollArea::AdjustIgnored。更改此属性实际上可能调整scrollarea大小。
访问函数
QAbstractScrollArea::SizeAdjustPolicy | sizeAdjustPolicy() const |
void | setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy) |
verticalScrollBarPolicy : Qt::ScrollBarPolicy
此属性持有关垂直滚动条的策略。
默认策略是 Qt::ScrollBarAsNeeded。
访问函数
Qt::ScrollBarPolicy | verticalScrollBarPolicy() const |
void | setVerticalScrollBarPolicy(Qt::ScrollBarPolicy) |
成员函数文档
[明确]
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::AlignTop 和 Qt::AlignBottom,这映射到垂直滚动条。
可以通过重新排列小部件或删除小部件来移除滚动条控件。还可以使用 QWidget::hide() 隐藏控件。
滚动条控件将调整大小以适合当前样式下的滚动条几何形状。以下描述了水平滚动条上的滚动条控件的情况
小部件的高度将设置为与滚动条高度匹配。要控制小部件的宽度,请使用 QWidget::setMinimumWidth 和 QWidget::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(),horizontalScrollBarPolicy 和 verticalScrollBar。
[重写虚保护]
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 传递。
[重写虚保护]
void QAbstractScrollArea::mousePressEvent(QMouseEvent *e)
重写:QWidget::mousePressEvent(QMouseEvent *event).
这个事件处理程序可以被子类重写以接收 viewport() 小部件的鼠标按下事件。事件通过 e 传递。
默认实现调用 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() 小部件的绘制事件。
另请参阅 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)
当滚动条移动了 dx,dy 时,将调用此虚拟处理程序,并且viewport的内容应该相应地滚动。
默认实现简单地在整个 viewport 上调用 update(),子类可以根据优化目的重写此处理程序,或者像 QScrollArea 一样移动内容小部件。参数 dx 和 dy 是为了方便而设置的,以便该类知道应该滚动多少(例如,在执行像素移动时很有用)。你也可以忽略这些值,直接滚动到滚动条所指示的位置。
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)
将视口设置为指定的 widget。QAbstractScrollArea 将获取给定 widget 的所有权。
如果 widget 是 nullptr
,QAbstractScrollArea 将为视口分配一个新的 QWidget 实例。
另请参阅 viewport。
[protected]
void QAbstractScrollArea::setViewportMargins(int left, int top, int right, int bottom)
将滚动区域周围的边距设置为 left、top、right 和 bottom。这对于像有“锁定”行和列的电子表格等应用程序很有用。留出空白的空间用于未用的区域,并将小部件放在未用区域中。
请注意,此函数通常由 QTreeView 和 QTableView 调用,因此 QAbstractScrollArea 子类必须实现边距。此外,如果子类要用于项目视图,则不应调用此函数。
默认情况下,所有边距都是零。
另请参阅 viewportMargins。
[protected]
void QAbstractScrollArea::setViewportMargins(const QMargins &margins)
设置滚动区域的 margins。这对于像有“锁定”行和列的电子表格等应用程序很有用。留出空白的空间用于未用的区域,并将小部件放在未用区域中。
默认情况下,所有边距都是零。
另请参阅 viewportMargins。
[虚拟]
void QAbstractScrollArea::setupViewport(QWidget *viewport)
此槽函数在调用 QAbstractScrollArea 的 setViewport(viewport) 后被调用。在 QAbstractScrollArea 的子类中重新实现此函数,以便在使用之前初始化新的 viewport。
另请参阅setViewport。
[重写虚函数]
QSize QAbstractScrollArea::sizeHint() const
返回滚动区域的 sizeHint 属性。大小由使用 viewportSizeHint() 加上为滚动条保留的额外空间(如有必要)来确定。
QScrollBar *QAbstractScrollArea::verticalScrollBar() const
返回垂直滚动条。
另请参阅setVerticalScrollBar(),verticalScrollBarPolicy 和 horizontalScrollBar()。
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(),contextMenuEvent 和 resizeEvent()。
[受保护]
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公司商标。所有其他商标均为其各自的产权所有。