本页内容

QScrollArea Class

QScrollArea 类提供了一个用于显示另一个小部件的滚动视图。更多内容...

标题: #include <QScrollArea>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QAbstractScrollArea

属性

公共函数

QScrollArea(QWidget *parent = nullptr)
virtual ~QScrollArea()
Qt::Alignment alignment() const
void ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50)
void ensureWidgetVisible(QWidget *childWidget, int xmargin = 50, int ymargin = 50)
void setAlignment(Qt::Alignment)
void setWidget(QWidget *widget)
void setWidgetResizable(bool resizable)
QWidget *takeWidget()
QWidget *widget() const
bool widgetResizable() const

重新实现的公共函数

virtual bool focusNextPrevChild(bool next) override
virtual QSize sizeHint() const override

重新实现的受保护函数

virtual bool event(QEvent *e) override
virtual bool eventFilter(QObject *o, QEvent *e) override
virtual void resizeEvent(QResizeEvent *) override
virtual void scrollContentsBy(int dx, int dy) override
virtual QSize viewportSizeHint() const override

详细说明

滚动区域用于在框架内显示子控件的内容。如果控件超出了框架的大小,视图可以提供滚动条,以便能够查看子控件的整个区域。子控件必须通过 `setWidget()` 指定。例如:

QLabel *imageLabel = new QLabel;
QImage image("happyguy.png");
imageLabel->setPixmap(QPixmap::fromImage(image));

scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(imageLabel);

上述代码创建了一个包含图像标签的滚动区域(如下图所示)。当缩放图像时,滚动区域会提供必要的滚动条:

没有滚动条的图片带有水平滚动条的图片带有水平和垂直滚动条的图片

滚动条的外观取决于当前设置的scroll bar policies 。您可以使用从QAbstractScrollArea 继承的功能来控制滚动条的外观。

例如,您可以设置QAbstractScrollArea::horizontalScrollBarPolicy 和QAbstractScrollArea::verticalScrollBarPolicy 属性。或者,如果您希望滚动条在滚动区域内容发生变化时动态调整,可以使用horizontalScrollBar()和verticalScrollBar()函数(这些函数允许您访问滚动条),并在滚动区域内容发生变化时,使用QScrollBar::setValue()函数设置滚动条的值。

您可以使用widget() 函数获取子控件。可通过setWidgetResizable() 函数使视图支持调整大小。控件的对齐方式可通过setAlignment() 进行指定。

两个便捷函数ensureVisible() 和ensureWidgetVisible() 可确保视口内显示内容的特定区域始终可见,必要时会自动滚动内容。

尺寸提示与布局

当使用滚动区域来显示自定义小部件的内容时,确保子小部件的size hint 设置为合适的值非常重要。如果子小部件使用了标准的QWidget ,可能需要调用QWidget::setMinimumSize() 来确保小部件的内容在滚动区域内正确显示。

如果使用滚动区域来显示包含按布局排列的子控件的控件内容,请务必注意:布局的大小策略也会决定该控件的大小。如果您打算动态更改布局的内容,了解这一点尤为重要。 在这种情况下,将布局的 `size constraint ` 属性设置为对布局最小和/或最大尺寸施加约束的值(例如 `QLayout::SetMinAndMaxSize`),将导致每当布局内容发生变化时,滚动区域的尺寸也会随之更新。

另请参阅 QAbstractScrollArea 和QScrollBar 。

属性文档

alignment : Qt::Alignment

该属性用于指定滚动区域中控件的对齐方式

有效的对齐方式由以下标志的组合构成:

  • Qt::AlignLeft
  • Qt::AlignHCenter
  • Qt::AlignRight
  • Qt::AlignTop
  • Qt::AlignVCenter
  • Qt::AlignBottom

默认情况下,控件会固定在滚动区域的左上角。

访问函数:

Qt::Alignment alignment() const
void setAlignment(Qt::Alignment)

widgetResizable : bool

该属性控制滚动区域是否应调整视图控件的大小

如果此属性设置为 false(默认值),则滚动区域将遵循其控件的大小。无论此属性如何设置,您都可以通过调用 `widget()` → `resize()` 来通过编程方式调整控件的大小,此时滚动区域会自动调整以适应新尺寸。

如果此属性设置为 true,滚动区域将自动调整视图控件的大小,以在可避免的情况下消除滚动条,或充分利用额外空间。

访问函数:

bool widgetResizable() const
void setWidgetResizable(bool resizable)

成员函数文档

[explicit] QScrollArea::QScrollArea(QWidget *parent = nullptr)

根据给定的parent ,构建一个空的滚动区域。

另请参阅 setWidget()。

[virtual noexcept] QScrollArea::~QScrollArea()

销毁滚动区域及其子控件。

另请参阅 setWidget()。

void QScrollArea::ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50)

滚动滚动区域的内容,使点 (x,y) 显示在视口区域内,该视口的边距(以像素为单位)由xmargin 和ymargin 指定。如果无法到达指定的点,则将内容滚动到最近的有效位置。这两个边距的默认值均为 50 像素。

void QScrollArea::ensureWidgetVisible(QWidget *childWidget, int xmargin = 50, int ymargin = 50)

滚动卷轴区域的内容,使QScrollArea::widget()中的childWidget 在视口内可见,并按照xmargin 和ymargin 中以像素为单位指定的边距进行滚动。如果无法到达指定的位置,则将内容滚动到最近的有效位置。这两个边距的默认值均为50像素。

[override virtual protected] bool QScrollArea::event(QEvent *e)

重写了:QAbstractScrollArea::event(QEvent *event)。

[override virtual protected] bool QScrollArea::eventFilter(QObject *o, QEvent *e)

重写了:QObject::eventFilter(QObject *watched, QEvent *event)。

[override virtual] bool QScrollArea::focusNextPrevChild(bool next)

重新实现了:QWidget::focusNextPrevChild (bool next)。

[override virtual protected] void QScrollArea::resizeEvent(QResizeEvent *)

重写了:QAbstractScrollArea::resizeEvent(QResizeEvent *event)。

[override virtual protected] void QScrollArea::scrollContentsBy(int dx, int dy)

重新实现了:QAbstractScrollArea::scrollContentsBy(int dx, int dy)。

void QScrollArea::setWidget(QWidget *widget)

设置滚动区域的widget 。

widget 将成为滚动区域的子控件,并在滚动区域被删除或设置了新的控件时被销毁。

该小部件的autoFillBackground 属性将被设置为true 。

如果在添加widget 时滚动区域处于可见状态,则必须显式地调用show()。

请注意:您必须在调用此函数之前添加widget 的布局;如果稍后才添加,则widget 将不可见——无论您何时对滚动区域调用show()。在这种情况下,您也无法在后续对widget 调用show()。

另请参阅 widget()。

[override virtual] QSize QScrollArea::sizeHint() const

重新实现了:QAbstractScrollArea::sizeHint() const。

QWidget *QScrollArea::takeWidget()

移除滚动区域的小部件,并将该小部件的所有权移交给调用方。

另请参阅 widget()。

[override virtual protected] QSize QScrollArea::viewportSizeHint() const

重新实现了:QAbstractScrollArea::viewportSizeHint() const。

QWidget *QScrollArea::widget() const

返回滚动区域的小部件,如果不存在则返回nullptr 。

另请参阅 setWidget()。

© 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.