2020-10-07

    科技2024-01-30  111

    因工作原因从来没有用过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 *scrollArea=new QScrollArea(this); //创建一个Scroll Area的对象指针 scrollArea->setGeometry(10,10,300,300); //设置位置以及大小 QWidget *contentWidget=new QWidget(); //创建一个widegt(也就是在设计界面中跟随Scroll Area自动生成的widget) scrollArea->setWidget(contentWidget); //将两者关联 for(int i1=0;i1<4;i1++) //循环创建label放到widget上,而不是放到Scroll Area上 { QLabel *la=new QLabel(contentWidget); la->setGeometry(10,i1*30+10,300,10); la->setText(array[i1]); contentWidget->setGeometry(0,0,scrollArea->width()-20,i1*30+40); } scrollArea->show();

    转载自https://blog.csdn.net/imc980925/article/details/80363707

    版权声明:本文原博主的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

     

    最后需要加一句show(),不然会不显示。

    其中的array[]是自己提前定义的数组,

    Processed: 0.010, SQL: 8