前言

本文提出了一种使QStackedWidget尺寸根据内容自适应调整的解决方法。

问题提出

我们知道,QStackedWidget可以包含多个可切换的子窗口。多个子窗口的高度不一样时,此时将QStackedWidget放在一个垂直布局中,所有子窗口会保持和最高的子窗口相同的高度,从而导致高度原本较少的子窗口出现空白区域,看起来十分不紧凑。如何让QStackedWidget尺寸根据子窗口内容自动调整呢?

原因分析

原因显而易见,QStackedWidget虽然显示当前子窗口,但是当前子窗口的高度会受到其他子窗口的影响。
下面尝试解决此问题。

1. 添加垂直弹簧VerticalSpacer

要想自适应,当然需要加弹簧,加了弹簧后,切换子窗口,所有子窗口还是保持相同的高度,说明还是需要进一步修改。

2. 隐藏非当前子窗口及其的内容(无效方法)

切换到当前子窗口时时,把其他子窗口隐藏。经测试这种方法是无效的。因为从QStackedWidget源码中可以看到,在切换当前子窗口时,其他子窗口已经被隐藏了,我们再隐藏是徒劳的。

3. 添加布局(有效方法)

解决方法是在每个子窗口里加一个垂直布局,将原本的子窗口内容作为一个content_widget放到新加的布局里。在显示当前页面时,隐藏其他页面的content_widget即可。

void showStackedWidgetPage(QStackedWidget *stackedWidget, int idx)
{stackedWidget->setCurrentIndex(idx);// 经测试,隐藏page是不行的,需要隐藏page里面的content_widgetint page_count = stackedWidget->count();for (int i = 0; i < page_count; i++){QWidget *page = stackedWidget->widget(i);QObjectList objects = page->children();for (int j = 0; j < objects.size(); j++){QWidget *content_widget = qobject_cast<QWidget *>(objects.at(j));if (content_widget){content_widget->setVisible(i == idx);break; // 这里只是跳出当前页的for循环}}}
}

同理,对于水平不紧凑的问题,就采用添加水平布局来解决。

总结

根据以上内容,猜测可能的原因如下:

因为QStackedWidget里面是使用QStackedLayout实现的,可能是由于QStackedWidget里面的QStackedLayout,和普通的QVBoxLayout、QHBoxLayout在内部元素隐藏时,处理方式不一致导致的。即QStackedLayout中子窗口隐藏,不会留出可被VerticalSpacer压缩的空间,但QVBoxLayout和QHBoxLayout在内部元素隐藏时,会将释放的空间作为可压缩空间被VerticalSapce压缩,从而实现了紧凑的自适应布局。


如果您觉得文章有用,可以关注一下笔者公众号。

QStackedWidget实现自适应紧凑布局相关推荐

  1. HarmonyOS UI开发 AdaptiveBoxLayout(自适应盒子布局) 的使用

    AdaptiveBoxLayout 是什么 AdaptiveBoxLayout 是自适应盒子布局,该布局提供了在不同屏幕尺寸设备上的自适应布局能力,主要用于相同级别的多个组件需要在不同屏幕尺寸设备上自 ...

  2. 网页右边固定php,左侧固定,右侧自适应的布局方式

    这次给大家带来左侧固定,右侧自适应的布局方式,左侧固定,右侧自适应布局方式的注意事项有哪些,下面就是实战案例,一起来看一下. 第一种方法: Document .one { position: abso ...

  3. html流动布局,自适应css布局——流动布局新时代

    流动网页设计有很多好处,但也只有在正确使用的时候.合适的技巧会使页面在大屏幕.小屏幕抑.PDA小屏幕上都能得到良好的呈现.但是,糟糕的代码结构,对于流动布局来说将是灾难性的.因此,我们需要针对大多数流 ...

  4. html如何左侧固定div,详解左右宽度固定中间自适应html布局解决方案

    原标题:详解左右宽度固定中间自适应html布局解决方案 本文介绍了详解左右宽度固定中间自适应html布局解决方案,分享给大家,具体如下: a.使用浮动布局 html结构如下 left right ce ...

  5. jQuery实现等比例缩放大图片让大图片自适应页面布局

    在布局页面时,有时会遇到大图片将页面容器"撑破"的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面 ...

  6. 转: 自适应css布局—-流动布局新时代(译文)

    流动网页设计有很多好处,但也只有在正确使用的时候.合适的技巧会使页面在大屏幕.小屏幕抑.PDA小屏幕上都能得到良好的呈现.但是,糟糕的代码结构,对于流动布局来说将是灾难性的.因此,我们需要针对大多数流 ...

  7. 移动端h5框架自适应_Html5移动端页面自适应百分比布局

    按百分比布局,精度肯定不会有rem精确 Document * { padding: 0; margin: 0; } .one { width: 20%; height: 100px; float: l ...

  8. dwcc怎么设置html默认,Dreamweaver CC2018写div自适应页面布局的教程

    Dreamweaver CC2018怎么写div自适应页面布局?一般网页都是固定的宽度,所以不能自适应网页窗口大小.我们可以把宽度设置为百分比,这样就可以啦.只不过需要自己算好百分比的数值,接下来小编 ...

  9. 移动端开发注意事项、需要注意的问题、特殊属性、精灵图、座固定有自适应的布局

    一.移动端开发注意事项 网址:移动端开发注意事项 二.关于meta (一).常用的公共meta属性 1.viewport <meta name="viewport"conte ...

最新文章

  1. 字节跳动这份面试题,你能打几分
  2. 桌面虚拟化(八):扔掉你的电脑!电视就够了!
  3. 2005年4月全国计算机等级考试二级C语言笔试试题及答案
  4. (CodeForces 548B 暴力) Mike and Fun
  5. java 7 g1_java7中G1垃圾收集器使用和流程总结
  6. 傲笑九天志在必得,卧薪尝胆勇者无畏.
  7. 【OpenCV】将RGB图像转为灰度图
  8. hdu 1874 Dijkstra算法模板
  9. centos 安装 redmine 2.1.4
  10. android 中Dialog对话框及自定义Dialog的方法
  11. 这个世界是那样的似曾相识
  12. 查询结果做缓存的例子
  13. 游戏开发之C++类中的static、const梳理总结(C++基础)
  14. 【cs231】损失函数与优化
  15. python 鼠标 自动点击_Python实现鼠标隔几秒自动点击电脑某区域
  16. win7自带的xps viewer很好用
  17. c 文件中调用 cpp 中函数
  18. html 京东购物车样式,购物车css样式效果
  19. wordpress模板_如何在15分钟内定制WordPress模板
  20. python 录音左右声道_Python分离立体声wav压缩文件的左右声道

热门文章

  1. 剑客决斗(NYOJ 110)
  2. 鸡啄米vc++2010系列2(项目文件分析)
  3. matlab二元一次方程求解_2-函数的求解计算
  4. 破解静态WEP KEY全过程
  5. windows7远程linux,用XManager在Windows7下远程桌面连接Linux
  6. java类与对象实验报告心得体会_第四周课程总结与实验报告(Java简单类与对象)...
  7. 数据插不进mysql_数据插入不进数据库里面去。
  8. action无法传参数给html页面,HTML 解决form表单提交时,action url中参数无效问题
  9. 二叉树的创建_大多数人都不会手写创建并遍历二叉树,一航这里帮你终结了
  10. 蓝图中实现人物移动2