基本Widgets(23):【类】QAbstractScrollArea [官翻]

QAbstractScrollArea Class

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

Header#include < QAbstractScrollArea >
qmakeQT += widgets
InheritsQFrame
Inherited ByQAbstractItemView, QGraphicsView, QMdiArea, QPlainTextEdit, QScrollArea, and QTextEdit

详细说明

QAbstractScrollArea是滚动区域的低级抽象。该区域提供了一个称为viewport中心小部件,在其中滚动区域的内容(即,在viewport中呈现内容的可见部分)。

视口旁边是一个垂直滚动条,下面是一个水平滚动条。当所有区域内容都适合视口时,根据滚动条的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在virtualViewPortEvent() 处理程序中提供了所有视口事件。在有意义的情况下,QWidget的专用处理程序被重新映射到视口事件。重新映射的专用处理程序是:paintEvent() 、mousePresseEvent() 、mouseReleaseEvent() 、mouseDoubleClickEvent() 、mouseMoveEvent() 、wheelEvent() 、dragEnterEvent() 、dragMoveEvent() 、dragLeaveEvent() 、dropEvent() 、contextMenuEvent() 和resizeEvent() 。

QScrollArea继承了QAbstractScrollArea,为任何QWidget提供平滑的滚动(即,widget逐像素滚动)。如果需要更专门的行为,只需要将QAbstractScrollArea子类化。例如,如果区域的全部内容不适合在QWidget上绘制,或者您不希望平滑滚动,则这是正确的。

公共类型

enum SizeAdjustPolicy

此枚举指定当视口大小更改时,QAbstractScrollArea的大小提示应如何调整。

ConstantValueDescription
AdjustIgnored0滚动区域的行为将与以前一样-不做任何调整。
AdjustToContentsOnFirstShow1滚动区域将在第一次显示时调整到其视口。
AdjustToContents2滚动区域将始终根据视口进行调整

属性

  1. horizontalScrollBarPolicy: Qt::ScrollBarPolicy 水平滚动条的策略

    默认策略是Qt::scrollbarasneed。

    Access functions:

    • Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
    1. void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
  2. verticalScrollBarPolicy: Qt::ScrollBarPolicy 垂直滚动条的策略

    默认策略是Qt::scrollbarasneed。

    Access functions:

    • Qt::ScrollBarPolicy verticalScrollBarPolicy() const
    • void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)

    enum Qt::ScrollBarPolicy

    此枚举类型描述QAbstractScrollArea的滚动条的各种模式。

    ConstantValueDescription
    Qt::ScrollBarAsNeeded0当内容太大而无法容纳时,QAbstractScrollArea会显示一个滚动条。这是默认值。
    Qt::ScrollBarAlwaysOff1QAbstractScrollArea从不显示滚动条。
    Qt::ScrollBarAlwaysOn2QAbstractScrollArea始终显示一个滚动条。在具有瞬时滚动条的系统上(例如,在版本10.7的Mac上),此属性被忽略。
  3. sizeAdjustPolicy: SizeAdjustPolicy 当视口大小更改时滚动区域大小如何更改的策略

    默认策略是QAbstractScrollArea::AdjustIgnored。更改此属性实际上可能会调整滚动区域的大小。

    Access functions:

    • QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
    • void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)

公共函数

构造和析构

  1. QAbstractScrollArea(QWidget *parent = nullptr)
  2. virtual ~QAbstractScrollArea()

属性相关

  1. Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
  2. void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
  3. Qt::ScrollBarPolicy verticalScrollBarPolicy() const
  4. void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
  5. QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
  6. void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)

特殊

  1. QWidget * cornerWidget() const

  2. void setCornerWidget(QWidget *widget)

  3. QScrollBar * horizontalScrollBar() const

  4. void setHorizontalScrollBar(QScrollBar *scrollBar)

  5. QScrollBar * verticalScrollBar() const

  6. void setVerticalScrollBar(QScrollBar *scrollBar)

  7. QWidget * viewport() const

  8. void setViewport(QWidget *widget)

  9. virtual void setupViewport(QWidget *viewport)

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

    在对齐指定的位置添加小部件作为滚动条小部件

    滚动条小部件显示在水平或垂直滚动条的旁边,可以放在滚动条的两侧。如果希望滚动条小部件始终可见,请将相应滚动条的滚动条策略设置为AlwaysOn。

    对齐方式必须是映射到水平滚动条的Qt::Alignleft和Qt::AlignRight之一,或映射到垂直滚动条的Qt::AlignTop和Qt::AlignBottom之一。

    滚动条小部件可以通过重新设置小部件的父级或删除它来删除。还可以使用QWidget::hide() 隐藏小部件
    滚动条小部件将调整大小以适应当前样式的滚动条几何图形。下面介绍了水平滚动条上滚动条小部件的情况:
    小部件的高度将设置为与滚动条的高度相匹配。要控制小部件的宽度,请使用QWidget::setMinimumWidth和QWidget::setMaximumWidth,或者实现QWidget::sizeHint() 并设置水平大小策略。如果您想要一个正方形小部件,请调用QStyle::pixelMetric(QStyle::PM_ScrollBarExtent)并将宽度设置为该值。

  11. QWidgetList scrollBarWidgets(Qt::Alignment alignment)

  12. QSize maximumViewportSize() const

重写的公共函数

  1. virtual QSize minimumSizeHint() const override
  2. virtual QSize sizeHint() const override

受保护的函数

  1. virtual void scrollContentsBy(int dx, int dy)
  2. void setViewportMargins(int left, int top, int right, int bottom)
  3. void setViewportMargins(const QMargins &margins)
  4. virtual bool viewportEvent(QEvent *event)
  5. QMargins viewportMargins() const
  6. virtual QSize viewportSizeHint() const

重写的受保护的函数

  1. virtual void contextMenuEvent(QContextMenuEvent *e) override
  2. virtual void dragEnterEvent(QDragEnterEvent *event) override
  3. virtual void dragLeaveEvent(QDragLeaveEvent *event) override
  4. virtual void dragMoveEvent(QDragMoveEvent *event) override
  5. virtual void dropEvent(QDropEvent *event) override
  6. virtual bool event(QEvent *event) override
  7. virtual void keyPressEvent(QKeyEvent *e) override
  8. virtual void mouseDoubleClickEvent(QMouseEvent *e) override
  9. virtual void mouseMoveEvent(QMouseEvent *e) override
  10. virtual void mousePressEvent(QMouseEvent *e) override
  11. virtual void mouseReleaseEvent(QMouseEvent *e) override
  12. virtual void paintEvent(QPaintEvent *event) override
  13. virtual void resizeEvent(QResizeEvent *event) override
  14. virtual void wheelEvent(QWheelEvent *e) override
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值