基本Widgets(24):【类】QScrollArea [官翻]

QScrollArea Class

QScrollArea类提供了一个到另一个小部件的滚动视图。

Header#include < QScrollArea>
qmakeQT += widgets
InheritsQAbstractScrollArea
Inherited By

详细说明

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

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

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

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

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

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

可以使用widget() 函数检索子小部件。可以使用setWidgetResizable() 函数调整视图的大小。可以使用setAlignment() 指定小部件的对齐方式。

两个方便的函数ensureVisible() 和ensureWidgetVisible() 通过在必要时滚动内容,确保在视口中可以看到内容的特定区域。

尺寸提示和布局

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

如果使用滚动区域来显示包含布局中排列的子小部件的小部件的内容,则必须认识到布局的大小策略也将决定小部件的大小。如果要动态更改布局的内容,这一点尤其有用。在这种情况下,将版面的“大小约束”属性设置为对版面的最小和/或最大大小提供约束的属性(例如,QLayout::SetMinAndMaxSize)将导致每当版面的内容更改时,滚动区域的大小都会更新。

有关使用QScrollArea类的完整示例,请参见图像查看器示例。该示例演示如何组合QLabel和QScrollArea来显示图像。

属性

  1. alignment: Qt::Alignment 滚动区域小部件的对齐方式

    有效的对齐方式是以下标志的组合:

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

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

    Access functions:

    • Qt::Alignment alignment() const
    1. void setAlignment(Qt::Alignment)
  2. widgetResizable: bool 滚动区域是否应调整视图小部件的大小

    如果此属性设置为false(默认值),则滚动区域接受其小部件的大小。
    不管此属性如何,您都可以使用widget()->resize() 以编程方式调整小部件的大小,滚动区域将自动调整为新的大小。
    如果此属性设置为true,滚动区域将自动调整小部件的大小,以避免滚动条出现在可以避免的地方,或者利用额外的空间。

    Access functions:

    • bool widgetResizable() const
    1. void setWidgetResizable(bool resizable)

公共函数

构造和析构

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

属性相关

  1. Qt::Alignment alignment() const
  2. void setAlignment(Qt::Alignment)
  3. bool widgetResizable() const
  4. void setWidgetResizable(bool resizable)

特殊

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

    滚动滚动区域的内容,使点(x,y)在视口区域内可见,边距由xmargin和ymargin以像素为单位指定。

    如果无法到达指定点,内容将滚动到最近的有效位置。两个边距的默认值都是50像素。

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

    滚动滚动区域的内容,以便QScrollArea::widget() 的childWidget在视口中可见,边距由xmargin和ymargin以像素为单位指定。
    如果无法到达指定点,内容将滚动到最近的有效位置。两个边距的默认值都是50像素。

  3. QWidget * widget() const 返回滚动区域的小部件,如果没有则返回nullptr。

  4. void setWidget(QWidget *widget) 设置滚动区域的小部件。

    小部件将成为滚动区域的子部件,并且在删除滚动区域或设置新小部件时将被销毁。
    小部件的autoFillBackground属性将设置为true。
    如果添加小部件时滚动区域可见,则必须显式显示它。
    请注意,在调用此函数之前必须添加小部件的布局;如果稍后添加,则无论何时显示滚动区域,小部件都将不可见。在这种情况下,以后也不能show() 小部件。

  5. QWidget * takeWidget() 移除滚动区域的小部件,并将小部件的所有权传递给调用者。

重写的公共函数

  1. virtual bool focusNextPrevChild(bool next) override
  2. virtual QSize sizeHint() const override

重写的受保护函数

  1. virtual bool event(QEvent *e) override
  2. virtual bool eventFilter(QObject *o, QEvent *e) override
  3. virtual void resizeEvent(QResizeEvent *) override
  4. virtual void scrollContentsBy(int dx, int dy) override
  5. virtual QSize viewportSizeHint() const override

小示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvhsvvSe-1611659682181)(E:\Users\Desktop\1.png)]

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);
    app.setApplicationName ("QScrollArea");

    QScrollArea w;

    w.setContentsMargins (20,30,20,30);

    QFrame widget1;
    widget1.setMinimumSize (800,600);
    widget1.setFrameStyle (QFrame::Panel | QFrame::Plain );
    widget1.setLineWidth (10);
    widget1.setMidLineWidth (10);
    widget1.setStyleSheet ("background:magenta");

    QFrame corner;
    corner.setStyleSheet ("background:green");
    corner.setFrameStyle (QFrame::WinPanel | QFrame::Sunken );

    w.setCornerWidget (&corner);
    w.setWidget (&widget1);

    w.show ();
    app.exec();
    return 0;
}

参考

  • Image Viewer Exampl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值