首页 > 其他分享 >QScrollArea的用法

QScrollArea的用法

时间:2023-02-01 17:12:49浏览次数:47  
标签:控件 用法 滚动条 QScrollArea QWidget new 幕布

今天发布的软件,因为显示器屏幕分辨率不同,导致软件显示不全的问题。

1440*900分辨率出现右侧坐标轴显示不全的问题

一种解决思路把所有控件放到QScrollArea控件里,利用滚动条显示全部。

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

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

"内容层"相当于一块很大的幕布,按钮、label等控件都被绘制在了幕布上,而QScrollArea相当于一个小窗口,透过这个小窗口我们看一看到幕布上的一小部分内容,拖动滚动条相当于在窗口后面移动幕布,这样我们就能透过窗口看到幕布上不同位置的内容。

这个幕布本质上就是一个QWidget,如果QScrollArea是从UI设计师界面拖出来的,那么QT会自动为我们创建这个幕布,如果你是用代码new出来的QScrollArea,那么不要忘记同时new一个幕布widget,并通过QScrollArea::setWidget(QWidget *)把幕布和QScrollArea关联起来。

这里有一个坑,如果你写了一个功能更强的QScrollArea的子类,假设叫QScrollAreaEx(里面自带幕布,幕布中自带一些按钮什么的),在ui设计师界面把QScrollArea提升为QScrollAreaEx的时候,你会发现,按钮并没有显示出来,why?因为QT自动生成的ui代码中,new了一个幕布控件,并把这个空的幕布赋给了QScrollAreaEx对象,这真是太坑了。解决方案有两种,①自己用代码new QScrollAreaEx,②在ui中拖出一个非QScrollArea的QWidget控件,然后提升为QScrollAreaEx。

一旦理解了幕布和观察窗口的关系,就能很容易的总结出QScrollArea的标准编程步骤,分这么几种情况:

情形1,纯代码实现

参考后文链接,有代码讲的很详细

情形2,QScrollArea是直接在ui里拖出来的,滚动区里面的控件是代码new的

参考后文链接讲的很详细

情形3,QScrollArea和它里面的控件都是直接在ui里拖出来的

上面是我遇到的情况。

点击scrollArea选择上面任意一种布局

内容层幕布scorllAreaWidgetContents 进行了栅格布局

 滚动条出来了

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

只要幕布控件scorllAreaWidgetContents的大小超过了QScrollArea的大小,就会自动出现滚动条;如果幕布比观察窗口还小,那就不会出现滚动条。

再补充几点:

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

 

这有一个评论写的好,修改scorllAreaWidgetContents的宽高的minimumSize的大小超过QScrollArea的宽高的大小就会出现滚动条

 

参考:Qt图形图像开发之QT滚动区控件QScrollArea怎么用 - 编程语言 - 亿速云 (yisu.com)

标签:控件,用法,滚动条,QScrollArea,QWidget,new,幕布
From: https://www.cnblogs.com/littleheadache/p/17083432.html

相关文章

  • MySql 中 case when then else end 的用法
    解释:SELECTcase-------------如果whensex='1'then'男'-------------sex='1',则返回值'男'whensex='2'then'女'--------......
  • 常见损失函数用法及其比较
    1. 损失函数损失函数(lossfunction)或代价函数(costfunction)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。在应......
  • 嵌入式开发中一些少见的C语言用法
    使用STM32开发的朋友不知道是否有发现过这样的一些宏定义?如下:#ifdefined(__CC_ARM)#pragmaanon_unions#endif看到上面的语句一开始确实搞不懂为什么要写这些东西,通过上......
  • 数组对象的一些快捷用法
    1、数组对象去重this.polluteNumOptions=[            {              remark:'aa',       ......
  • 【mysql】 查询数据时group by,及group_concat()函数用法
    GROUPBY语句语法select聚合函数,列(要求出现在groupby的后面)from表where筛选条......
  • static的详细用法
    1.C++的static有两种用法,面向过程程序设计中的static和面向对象程序涉及中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用1面向过程涉及中......
  • 反射操作的基础代码用法
    `packagecn.javaguide;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;publicclassMain{......
  • 01基本用法
    importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(-1,1,50)#y=2*x+1y=x**2plt.plot(x,y)plt.show()......
  • JUnit4 基本用法实例
    本教程介绍了在JUnit4中支持的基本注解。importorg.junit.*;importstaticorg.junit.Assert.*;importjava.util.*;/***@authoryiibai**/publicclassJunitTest......
  • Digicert EV证书签名后出现“证书对于请求用法无效”的解决方案
    一、具体问题近期部分客户使用​​EV代码签名证书Pro​​签名程序后,在部分电脑上安装或查看签名时会出现“证书对于请求用法无效”的错误,具体错误见下图:此问题出现的原因是......