• QAbstractScrollArea、QScrollArea


    QAbstractScrollArea

    一、描述

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

    视口旁边是一个垂直滚动条,下面是一个水平滚动条。当区域中所有内容都显示在视口时,滚动条可以是可见的或隐藏的,具体取决于滚动条的 Qt::ScrollBarPolicy。当滚动条被隐藏时,视口会扩大以覆盖所有可用空间。当滚动条再次可见时,视口会缩小以便为滚动条腾出空间。

    1.1、继承 QAbstractScrollArea

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

    在继承 QAbstractScrollArea 时,需要进行以下操作:

    • 通过设置滚动条的范围、值、页面步长和跟踪它们的移动来控制滚动条。
    • 根据滚动条的值在视口中绘制区域的内容。
    • viewportEvent() 中处理视口接收到的事件。
    • 使用 viewport()->update() 来更新视口的内容,而不是 update(),因为所有的绘制操作都发生在视口上。
    • 每当视口接收到调整大小事件内容的大小发生更改时,都应更新滚动条和视口。当滚动条值改变时,视口也需要更新。

    一个简单的例子,其中实现了一个可以滚动任何QWidget的滚动区域。使小部件成为视口的子项,这样就不必计算要绘制小部件的哪一部分,而是可以简单地使用 QWidget::move() 移动小部件。当区域内容或视口大小发生变化时,执行以下操作:

    1. QSize areaSize = viewport()->size();
    2. QSize widgetSize = widget->size();
    3. verticalScrollBar()->setPageStep(areaSize.height());
    4. horizontalScrollBar()->setPageStep(areaSize.width());
    5. verticalScrollBar()->setRange(0, widgetSize.height() - areaSize.height());
    6. horizontalScrollBar()->setRange(0, widgetSize.width() - areaSize.width());
    7. updateWidgetPosition();

    当滚动条改变值时,需要更新小部件位置,即在视口中找到要绘制的小部件部分:

    1. int hvalue = horizontalScrollBar()->value();
    2. int vvalue = verticalScrollBar()->value();
    3. QPoint topLeft = viewport()->rect().topLeft();
    4. widget->move(topLeft.x() - hvalue, topLeft.y() - vvalue);

    为了跟踪滚动条的移动,重新实现虚函数 scrollContentsBy()。为了微调滚动行为,连接到滚动条的 QAbstractSlider::actionTriggered() 信号并根据需要调整 QAbstractSlider::sliderPosition()。

    为方便起见,QAbstractScrollArea 使所有视口事件在 viewportEvent() 处理程序中可用。

    二、类型成员

    1、enum QAbstractScrollArea::SizeAdjustPolicy:此枚举指定当视口大小发生变化时滚动区域大小的变化策略。

    • AdjustIgnored:不进行任何调整。
    • AdjustToContents:滚动区域会一直调整到视口。
    • AdjustToContentsOnFirstShow:滚动区域将在第一次显示时调整到它的视口。

    三、属性成员

    1、HorizontalScrollBarPolicy : Qt::ScrollBarPolicy

          verticalScrollBarPolicy : Qt::ScrollBarPolicy

    水平、垂直滚动条的策略。默认策略是 Qt::ScrollBarAsNeeded

    enum Qt::ScrollBarPolicy

    • Qt::ScrollBarAsNeeded:在内容太大而无法容纳时显示滚动条,否则不显示。
    • Qt::ScrollBarAlwaysOff:从不显示滚动条。
    • Qt::ScrollBarAlwaysOn:总是显示滚动条。

    2、sizeAdjustPolicy : SizeAdjustPolicy

    当视口大小发生变化时滚动区域大小如何变化的策略。

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

    四、成员函数

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

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

    滚动条小部件显示在水平或垂直滚动​​条旁边,可以放置在它的任一侧。如果希望滚动条小部件始终可见,将相应滚动条的 scrollBarPolicy 设置为 ScrollBarAlwaysOn

    如果是水平滚动条,alignment 必须是 Qt::AlignleftQt::AlignRight 之一。

    如果是垂直滚动条,alignment 必须是 Qt::AlignTopQt::AlignBottom 之一。

    滚动条小部件将调整大小以适合当前样式的滚动条几何形状。

    1. #include
    2. Widget::Widget(QWidget *parent)
    3. : QWidget(parent)
    4. {
    5. QScrollArea * scrollArea = new QScrollArea;
    6. scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    7. auto slider = new QSlider(Qt::Vertical);
    8. slider->setRange(0,1000);
    9. QLabel * label = new QLabel("hello");
    10. label->setFixedHeight(1000);
    11. scrollArea->setWidget(label);
    12. scrollArea->addScrollBarWidget(slider,Qt::AlignTop);
    13. connect(slider,&QSlider::valueChanged,scrollArea->verticalScrollBar(),&QScrollBar::setValue);
    14. QHBoxLayout * hb = new QHBoxLayout(this);
    15. hb->addWidget(scrollArea);
    16. }

          QWidgetList scrollBarWidgets(Qt::Alignment alignment)

    返回当前设置的滚动条小部件的列表。

    2、QScrollBar* horizontalScrollBar() / void setHorizontalScrollBar(QScrollBar *scrollBar)

    水平滚动条。

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

          QScrollBar *verticalScrollBar() / void setVerticalScrollBar(QScrollBar *scrollBar)

    垂直滚动条。

    3、QSize maximumViewportSize()

    视口的大小。

    4、【虚函数】void scrollContentsBy(int dx, int dy)

    当滚动条被 dx、dy 移动时调用这个处理程序,因此应该相应地滚动视口的内容。

    调用此函数以编程方式滚动是错误的,应该改用滚动条(例如,通过直接调用 QScrollBar::setValue())。

    5、void setCornerWidget(QWidget *widget)

    将两个滚动条之间角落的小部件设置为小部件。

    6、void setViewportMargins(int left, int top, int right, int bottom)

    设置滚动区域周围的边距。边缘空间留空。小部件将放在未使用的区域。

    这个函数一般被 QTreeViewQTableView 调用。

    7、bool viewportEvent(QEvent *event)

    滚动区域的主要事件处理程序(viewport() 小部件)。

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

    可以在子类中重新实现此函数,但建议使用专门的事件处理程序。


    QScrollArea

    一、描述

    QScrollArea 类继承自 QAbstractScrollArea 。提供一个滚动视图小部件。用于在框架内显示子窗口小部件的内容。如果小部件超过框架的大小,视图可以提供滚动条,以便可以查看子小部件的整个区域。

    二、属性成员

    1、alignment : Qt::Alignment

    滚动区域小部件的对齐方式,有效值是以下标志的组合:

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

    默认情况下,小部件保持在滚动区域的左上角。

    2、widgetResizable : bool

    是否应调整视图小部件的大小。

    如果为 false(默认值),则滚动区域遵循其小部件的大小。

    如果为 true,则滚动区域将自动调整小部件的大小,以充分利用额外的空间。

    不管这个属性如何,都可以使用 widget()->resize() 以编程方式调整小部件的大小,滚动区域将自动调整到新的大小。

    三、成员函数

    1、void ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50)

    滚动滚动区域的内容,使点 (x, y) 在视口区域内可见,其边距由 xmargin 和 ymargin 指定,以像素为单位。如果无法到达指定点,则将内容滚动到最近的有效位置。

    2、void ensureWidgetVisible(QWidget *childWidget, int xmargin = 50, int ymargin = 50)

    滚动滚动区域的内容,以便 widget() 的 子部件 childWidget 在视口内可见,其边距由 xmargin 和 ymargin 以像素为单位指定。如果无法到达指定点,则将内容滚动到最近的有效位置。

    3、void setWidget(QWidget *widget) / QWidget * widget()

    滚动区域的小部件。

    小部件成为滚动区域的子级,并在删除滚动区域或设置新的小部件时被销毁。

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

    如果添加小部件时滚动区域(this)可见,则必须显式调用 show()

    必须在调用此函数之前添加小部件的布局,否则该小部件将不可见

    4、QWidget * takeWidget()

    删除滚动区域的小部件,并将小部件的所有权传递给调用者。

  • 相关阅读:
    leetcode解题思路分析(一百四十九)1297 - 1304 题
    java代理相关知识
    Java学习的知识笔记
    【TypeScript】带类型语法的JavaScript
    nodejs处理图片的几种方法,使用sharp,jimp,webconvert
    在 Streamlit 中使用自定义 CSS 创建加密仪表板
    发票关键信息抽取SER
    俺把所有粉丝显示在地图上啦~【详细教程+完整源码】
    一种新的UI测试方法:视觉感知测试
    模拟面试01
  • 原文地址:https://blog.csdn.net/kenfan1647/article/details/126025419