精华内容
参与话题
问答
  • QScrollArea属于控件容器类,可以直接在ui中拖出来。 对于QScrollArea,最难搞懂的就是:如何控制它,才能让它在我们想要出现滚动条的时候出现滚动条。 我们拖入一个QScrollArea,再向他里面拖入4个button,观察...

    转自 https://blog.csdn.net/qq_31073871/article/details/83117430

    QScrollArea属于控件容器类,可以直接在ui中拖出来。

    对于QScrollArea,最难搞懂的就是:如何控制它,才能让它在我们想要出现滚动条的时候出现滚动条。

    我们拖入一个QScrollArea,再向他里面拖入4个button,观察信息如下:

    可以发现,4个button并不是直接位于QScrollArea中的,而是位于它的成员scorllAreaWidgetContents中的,这个成员的类型也是控件类型QWidget,也就是说,QScrollArea这个容器本身就套了两层,我们放入的按钮等控件,都处在scrllAreaWidgetContents层,下文中我把QScrollArea.widget统一称之为“内部容器”,内部容器是QScrollArea这个控件的子控件。

    补充一点,内层的这个scrllAreaWidgetContents,我们可以更换掉它,方法就是QScrollArea::setWidget(QWidget *),如果scrollArea控件是用鼠标拖出来的,那么QT会自动为我们new一个内部容器,如果scrollArea控件是用代码创建的,那么不忘忘了为这个滚动区创建内部容器。

    帮助文档还指出,setWidget应当在“把想加的控件都加到内部容器”之后再调用,否则会无法显示(然而,我测试发现,帮助说的不对,即使我们在setWidget之前没有给内部容器设置布局也不要紧,只要在setWidget之后,内部容器调用一下adjustSize,就可以把内部容器的控件显示出来,当然,为了保险起见,或者后续程序兼容性起见,还是按照帮助文档来做吧)。

    总结一下滚动区的标准编程步骤:

    (1)new QscrollArea
    (2)new 内部容器
    (3)new 布局,例如网格布局QGridLayout(前3步不分先后顺序)
    (4)向布局中添加你想要的控件(这一步必须位于步骤3之后,这不是废话吗)
    (5)关联"内部容器"和"布局"(如果在创建布局时,就把布局构造在了内部容器中,那么这一步就省了)
    (6)关联"内部容器"和"滚动区",也即调用QScrollArea::setWidget(QWidget *),这一步必须位于步骤4、5之后。

     

     

    一句话总结何时出现滚动条:

    只要QScrollArea的尺寸 < 内部容器的尺寸,就会自动出现滚动条。下面举个具体的例子:

    程序初始时我们通过setGeometry设置内部容器的尺寸为100X100,QScrollArea放置在主界面的布局中,也即QScrollArea的尺寸是随着用户鼠标拖动窗口变化而变化的,那么当用户拖大窗口时,QScrollArea也变得很大,而内部容器还是100X100,这时,滚动条就消失了;如果用户用鼠标缩小了窗口,QScrollArea也随之变的很小了,而内部容器还是100X100,QScrollArea就会自动出现滚动条。

    记住一句话,除非你在程序运行时修改了内部容器的大小,否则,内部容器将一直保持它初始的大小。那么

     

     

    下面讲如何控制滚动条何时出现?

    有了上面的分析,我们已经知道了QScrollArea有两层,QScrollArea本身是个QWidget,它内部又套了一个小QWidget。在默认情况下,内部的这个小QWidget,也即scorllAreaWidgetContents,它的大小总是等于外部QWidget(也即QScrollArea)的大小。除非我们给scorllAreaWidgetContents设置了宽高的最小值,这时,当QScrollArea的宽或高,一旦小于scorllAreaWidgetContents的宽或高,就会出现滚动条。

    这个scorllAreaWidgetContents是从哪来的?查看QT自动生成的ui代码(也即:ui->setupUi(this)函数)可见,它是在QScrollArea构造完成之后,再被new出来的,然后调用了QScrollArea::setWidget()。这一点对于我们编程非常重要,否则一不小心就中了坑,假设我们自己继承QScrollArea写了一个新的子类,在子类的构造函数中我们通过QScrollArea::setWidget()设置好了自己的小QWidget,然后在ui中把QScrollArea提升为自己写的这个子类,这时就扯淡了,我们在子类构造函数中为小QWidget添加的控件都没有显示出来,因为QT自作主张,在我们自己的构造函数执行完之后,重新new了小QWidget,并通过setWidget函数设置给了这个子类!这真是太坑了。如果你想通过ui提升的方式来使用自己写的子类,那么请你在ui拖入一个Frame容器或者widget容器等等进行提升,反正不要用拖入的QScrollArea容器进行提升。如果你非得想用QScrollArea容器进行提升,那么你想在QScrollArea的内部容器中添加控件时,请不要把添加控件的代码写在QScrollArea子类的构造函数中。

    下面继续研究滚动条问题。

    直接看例子,我给scorllAreaWidgetContents成员设置宽高最小值为500*1000,这么高的scorllAreaWidgetContents,显然QScrollArea在高度上是无法容纳下的。实际上,看效果发现,还没有运行程序,就已经有滚动条了

    我们运行一下程序,然后把窗口缩小,看看是不是当窗口<scorllAreaWidgetContents最小值500*1000时,会自动出现水平滚动条。看下图发现,并没有出现我们期望的效果。

    原因就是,水平滚动条,只有当QScrollArea<内部的QWidget时,才会出现,显然上图中,QScrollArea虽然没显示全,但是QScrollArea的宽度仍然保持原值,只是被遮住了而已。要想使QScrollArea的宽度变小,要么通过程序直接修改,要么通过设置布局,使QScrollArea的宽度随窗体的宽度减小而减小。我们这里就简单一点,直接给窗体设置网格布局,使得QScrollArea的大小受窗体大小驱动。运行起来,再看下效果:

    再补充几点:

    内部的小QWidget与QScrollArea的关系,就像是给QScrollArea设置了网格布局,然后把小QWidget放进了这个布局中,如果给小QWidget设置的最大宽高<QScrollArea的实时大小,那么QScrollArea会显示出空白,而空白部分是无法放置/显示我们自己拖入的控件的,如下图:

    如果我们不给小QWidget设置宽高最大值,那么它的宽width将满足:

    它的高也有与之相同的规律。

    知道了原理,不论是用UI设计器来做界面,还是直接用代码来做界面,就都不是问题了。

     

    技巧:

    通过上述操作,我们知道了,我们可以通过设置内部小QWidget的宽、高最小值,来让外部QScrollArea适时的出现滚动条,那么到底把小QWidget的宽、高最小值设置为多少合适呢?

    答案是显然的:把小QWidget的宽、高最小值设置为刚好能容纳内部的按钮等控件,这样看起来最舒服。难道我要先计算或者观察一下按钮等控件占用的面积之后,才能去设置小QWidget的宽、高最小值吗?

    这样做太费劲了,我们肯定不会去这样做,除非是用ui设计师拖控件时,所见即所得,才无需计算小QWidget的宽、高最小值。用代码写界面时,最好的做法是:

    1、向小QWidget中添加按钮等控件时,随着添加的按钮增多,小QWidget自动变大,显然用QGridLayout来做就能实现这个自动增大这个需求。自动增大也只是出现创建内部容器阶段,一旦内部容器和布局、布局内的控件都创建和添加完毕,后续即使再向布局中添加控件,内部容器也不会自动增大了,这时只有靠setGeometry手动修改内部容器的大小了。

    2、添加完控件后,手动调用一下adjustSize函数,该函数会根据所有子控件的大小之和,来调整父控件的大小。

    步骤如下:先在ui中拖入一个QScrollArea控件,名字为scrollArea,然后添加代码:
     

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
     
        QGridLayout *pLayout = new QGridLayout();//网格布局
        for(int i = 0; i < 100; i++)
        {
            QPushButton *pBtn = new QPushButton();
            pBtn->setText(QString("按钮%1").arg(i));
            pBtn->setMinimumSize(QSize(60,30));   //width height
            pLayout->addWidget(pBtn);//把按钮添加到布局控件中
        }
        ui->scrollArea->widget()->setLayout(pLayout);//把布局放置到QScrollArea的内部QWidget中
    }

     根据原著者的描述,转载人补充如下代码,展示在不使用ui拖拽的情况下,实现滚动条:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QHBoxLayout>
    #include <QPushButton>
    #include <QScrollArea>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        QScrollArea * scrollArea = new QScrollArea(this);
        QWidget * pWgt = new QWidget;
    
        QHBoxLayout *pLayout = new QHBoxLayout();//网格布局
            for(int i = 0; i < 100; i++)
            {
                QPushButton *pBtn = new QPushButton();
                pBtn->setText(QString("按钮%1").arg(i));
                pBtn->setMinimumSize(QSize(60,30));   //width height
                pLayout->addWidget(pBtn);//把按钮添加到布局控件中
            }
        pWgt->setLayout(pLayout);
    
        //这一句setWidget必须放在pWgt里面的内容都准备完毕之后,否则显示有问题
        scrollArea->setWidget(pWgt);
        setCentralWidget(scrollArea);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

     

    展开全文
  • QT的QScrollArea使用详解

    千次阅读 2018-09-13 16:54:50
    在Qt中有一个很好的类 QScrollArea。 有两种方式可是实现滚动区域: 第一种直接用 Qt Designer 去设计ui文件: 拖入QScrollArea然后进行布局即可。 第二种是代码实现: QLabel *imageLabel = new Q...

    有些时候,我们界面能展示的区域被限定的很小,但是需要展现的控件、内容却很多,在限定大小的区域中无法全部显示。这个时候就需要滚动条了。在Qt中有一个很好的类 QScrollArea

    有两种方式可是实现滚动区域:

    第一种直接用 Qt Designer 去设计ui文件:

    拖入QScrollArea然后进行布局即可。

    第二种是代码实现:

    QLabel *imageLabel = new QLabel(this);
    QPixmap pixmap(":/Images/head");
    pixmap = pixmap.scaled(200, 200, Qt::KeepAspectRatio);  // 图片缩放
    imageLabel->setPixmap(pixmap);
    imageLabel->setStyleSheet("background: white;");  // 标签白色背景
    imageLabel->setAlignment(Qt::AlignCenter);  // 图片居中

    QScrollArea *scrollArea = new QScrollArea(this);
    scrollArea->setBackgroundRole(QPalette::Dark);  // 背景色
    scrollArea->setWidget(imageLabel);
    scrollArea->setAlignment(Qt::AlignCenter);  // 居中对齐

     

    scrollArea->widget()->resize(260, 260);  // 手动调整大小
    scrollArea->setWidgetResizable(true);  // 自动调整大小

    获取与移除部件

    获取

    可以通过widget()函数来获取滚动区域的部件,如果没有,则返回0。

    QWidget *widget = scrollArea->widget();
    QLabel *pLabel = qobject_cast<QLabel *>(widget);
    •  

    如果部件是一个QWidget的子类,可以用qobject_cast进行类型转换。

    移除

    如果要将部件从滚动区域中移除(即:在上例中,滚动区域不再显示图片),使用takeWidget()函数。

    QWidget *widget = scrollArea->takeWidget();
    QLabel *pLabel = qobject_cast<QLabel *>(widget);
    •  

    移除的同时,会将部件的所有权传递到调用者,可以用QWidget来接收。

    展开全文
  • Qt QScrollArea注意事项

    千次阅读 2018-08-11 12:20:28
    QScrollArea是Qt中一个常用的Widget,它可以根据内部组件大小,自主生成滚动条,节省了用户很大的精力,也为程序带来方便。 而QScrollArea中,使用QDesigner编写时,很多新人会发现程序并不像预期一样,出现了滚动...

    QScrollArea是Qt中一个常用的Widget,它可以根据内部组件大小,自主生成滚动条,节省了用户很大的精力,也为程序带来方便。

    而QScrollArea中,使用QDesigner编写时,很多新人会发现程序并不像预期一样,出现了滚动条,这是由于QDesigner 和 代码的构造情况不同的缘故。

    QDesigner中,QScrollArea构造时,QWidgetResizable(bool )这个方法是自动设为True的,而代码的构造函数则是false。

    这个方法就直接影响了Widget的大小。正如其名,它可以控制QScrollArea中的Widget是否会随着QScrollArea的大小变化,如设为True,则程序会尽可能不让QScrollArea出现滚动条,导致问题。

    展开全文
  • 因工作原因从来没有用过Qt的我最近也接触了一下Qt,在使用QScrollArea的时候发现UI添加进QScrollArea无法滑动,在网上找了很多教程也没发现一个编程新手,能给新手讲明白的教程。无奈之下只好自己琢磨,下面给大家...

        因工作原因从来没有用过Qt的我最近也接触了一下Qt,在使用QScrollArea的时候发现UI添加进QScrollArea无法滑动,在网上找了很多教程也没发现一个编程新手,能给新手讲明白的教程。无奈之下只好自己琢磨,下面给大家分享下我使用QScrollArea的过程及其Demo。

        两种方法:

            1.直接从设计中生成的QScrollArea(为什么从这个方法开始讲是因为对新手来说容易理解一点。理解了这个直接用代码写应该也能理解的。)

               ①首先从设计中生成一个QScrollArea。

               

                ②添加UI(之前我一直单纯的以为UI直接加入QScrollArea里面就行了,如果UI设置的坐标超过QScrollArea的大小QScrollArea就直接能滚动,结果发现不行,最后研究了一下午才弄懂为什么)

                

                一直纳闷为什么不能滚动,网上各种找资料,感觉网上大部分资料不是针对小白写的,最后发现在设计中生成QScrollArea的时候自动送了一个Widget作为ScrollArea的子widget。而想要滚动画面,就一定要这个widget比QScrollArea的size大的时候才可以,而且滚动的画面也是这个widget。(QScrollArea就像是一扇窗户,widget就像一块画布,画布比窗户大的时候,通过窗户只能看到画布的一部分,画布不断地滚动你就能看到画布的其他内容)所以,一定要把UI放进这个widget,并且最后要设置Widget的大小。

                  ③最后要设置QScrollArea的一个属性widgetResizable,这个属性用代码生成的时候默认是false,而用设计生成默认是true,找到它把它设置成false。

                   

                  这里在设计中创建是默认勾选的,去掉√,最后运行就ok了。

            2.用代码实现QScrollArea(大家看懂了上面的内容的话,下面的就大同小异了,直接给大家贴代码)

    结合代码加注释,相信大家能看懂的。然后在这里给大家解释下widget设置size的问题。

    如果你widget设置的widget和QScrollArea一样大会出现这种情况

            

    当你右边的ScrollBar出现的时候占用了一些宽度,导致QScrollArea的widget相对的来说变小了(不是变小了,只是这样解释给大家听)。这样的情况下,widget的宽度就是大于QScrollArea的宽度的,这样下面的ScrollBar也会出现。所以一般widget会设置比QScrollArea的宽度小一点点,具体小多少我没去研究,大家自己看看吧。

            然后给大家贴一张正常运行的截图。

               

    (此教程针对小白,所以会相对比较繁杂,大神轻踩。然后这是我自己对QScrollArea的理解,不一定完全正确,仅供参考!)

    展开全文
  • QScrollArea的简单使用

    千次阅读 2019-10-24 17:52:10
    当某个区域内的小部件尺寸超过了指定范围时,QScrollArea类提供了一个滚动区域,并生成滚动条,用于滚动显示区域内的所有小部件。 关键代码 /*****************************************************************...
  • [Qt]如何用好QScrollArea

    万次阅读 2017-11-17 17:20:34
    在Qt中有一个很好的类 QScrollArea。如下图所示,左边是界面被压缩限制时,显示的情况。右边是完全展示出的界面情况。使用方法本文直接用 Qt Designer 去设计ui文件,当然也可以直接在代码中写。Step1.拖入QScroll...
  • Qt 之 QScrollArea

    万次阅读 2016-09-02 11:31:27
    简述QScrollArea提供了一个滚动视图到另一个部件。滚动区域用于显示一个画面中的子部件的内容。如果部件超过画面的大小,视图可以提供滚动条,这样就都可以看到部件的整个区域。简述 基本使用 对齐方式 调整部件大小...
  • 主要介绍了Qt图形图像开发,QT滚动区控件(滚动条)QScrollArea的详细方法用法图解与实例,需要的朋友可以参考下
  • #include "ChatWidget.h" #include "ScrollArea.h" #include #include int main(int argc, char* argv[]) { QApplication app(argc, argv); ChatList chatList; chatList.show(); return app.e
  • QtQScrollArea的使用

    千次阅读 2015-07-31 10:03:24
    QWidget *w=new QWidget;  w->resize(1000,1000);... QScrollArea *scrollArea=new QScrollArea;  scrollArea->viewport()->setBackgroundRole(QPalette::Dark);  scrollArea->viewport()->setAutoFil
  • Qt--QScrollArea

    2018-06-14 10:43:58
    1、The QScrollArea class provides a scrolling view onto another widget. 2、A scroll area is used to display the contents of a child widget within a frame. If the widget exceeds the size of the fr...
  • QScrollArea提供了一个滚动视图到另一个部件。#include "scopewidget.h"#include &lt;QScrollArea&gt;#include&lt;Qlabel&gt; ScopeWidget::ScopeWidget(QWidget *parent) : QWidget...
  • 目标:动态设置QGridLayout子元素大小 运行结果: 例子下载路径: https://download.csdn.net/download/baidu_31868779/11241407
  • 关于QTQScrollArea在布局中影响窗口大小的笔记问题原因解决方案解决原理 问题原因 由于QT在布局的时候,每次窗口运算都会计算最小宽度,因此当我们把控件动态添加入QScrollArea中时候第一次打开没问题,但是当我们...
  • 主要组件:QScrollArea,QLable二、要点1.QScrollArea (1)用QScrollArea添加图片的代码如下:QScrollArea scrollArea; QLabel imageLabel; QPixmap pixMap; imageLabel.setPixmap(pixMap); scrollArea.setWidget
  • QT QScrollArea 内容超出时滚动条自动置底 在做一个QScrollArea时,想让超出页面显示的内容被添加进去时,让滚动条自动置于最底部: QScrollArea::verticalScrollBar()->setValue(QScrollArea::verticalScrollBar...
  • 在ui中设置了三个ScrollArea 试过在代码中添加下面几行 ui->scrollArea->setStyleSheet("background-color:transparent;"); ui->scrollArea_2->setStyleSheet("background-color:transparent;"); ui->scrollArea_3->...
  • Qt事例: QScrollArea滚动区域

    千次阅读 2017-05-30 23:57:21
    Qt事例: QScrollArea滚动区域 /******* ChatList.h ******/ #ifndef CHATLIST_H #define CHATLIST_H #include #include class ChatList: public QWidget { public:  ChatList(QWidget *parent);  ...
  • QtQScrollArea的滚动条自动下拉

    千次阅读 2016-11-01 14:16:11
    最近在做一个项目的时候,需要做一个log监视框。我用的是QTextEdit来显示我的log信息,但是发现每次我追加我的内容后QTextEdit中的滚动条没有自动下拉,每次需要自己往下拉,很是麻烦。找了一些资料实现了。...
  • QScrollArea is a QFrame descendant. If you set the frame shape to QFrame::NoFrame QScrollArea是派生于QFrame,如果设置QFrame的FrameShape值为NoFrame那么就可以实现边框去除 一、C++源码实现 ...
  • 下面是一个简单的QScrollArea的效果: 下面为上面gif动画的实现: //图片为300*300.把图片放到label中. QImage image("./1.png"); QLabel *label = new QLabel(this); label->resize(300,300); label->...
  • 1.代码去除 QScrollArea是派生于QFrame,如果设置QFrame的FrameShape值为NoFrame那么...scrollArea->setFrameShape(QFrame::NoFrame); 2.样式去除 QScrollArea{ color:#c3f8ff; font-family:"等线"; font-...
  • 当我们使用QT designer时,直接拖动添加一个QScrollArea时,会自动生成一个Qwidget的子对象。 当我们直接设置该Qwidget的geometry时,却无法生效。此时我们必须设置该Qwidget的minimumSize属性才能改变其大小。 ...
  • QScrollArea中显示图片时,其默认有一个鼠标滚轮控制垂直滚动条滚动的事件。所以当我想重写wheelEvent事件之后,它总是会在滚动条滚到头的时候才实现图像的缩放操作,所以怎样才能控制让滚轮操作只影响图像缩放,...
  • 1.头文件#ifndef BASEUI_H #define BASEUI_H#include #include #include #include #include #include #include #include #i
  • Obj->setFrameShape(QFrame::NoFrame);
  • QScrollArea 无法通过样式改变背景色,无法去除边框 QScrollArea 是无法通过样式表来改变背景色的,只能设置...scrollArea-&amp;gt;setBackgroundRole(QPalette::Dark); // 背景色 设置无边框去除边框: ...
  • QPixmap fitpixmap=image.scaled...size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); ui->label->setPixmap(fitpixmap); ui->label->setAlignment(Qt::AlignCenter); ui->label->show();
  • QScrollArea 滚动区域设置 背景色

    千次阅读 2016-05-09 14:56:09
    一个QWidget中,有一个QScrollArea,设置背景色的时候,设置QWidget的样式是没有作用的, 需要设置QScrollArea的样式,
  • enum ScrollBarPolicy { ScrollBarAsNeeded, //需要的时候显示 ScrollBarAlwaysOff,//总是关闭 ...QScrollArea *scroll=new QScrollArea; scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ...

空空如也

1 2 3 4 5 ... 20
收藏数 1,738
精华内容 695
关键字:

qscrollarea