Qt/GUI/布局/实现窗口折叠效果/且在操作时父窗口尺寸跟随变动

news2024/12/27 10:53:46

文章目录

  • 概述
  • 无法resize到小尺寸
  • 可行方案
  • 其他方案

概述

本文旨在,实现如下所示的显示或隐藏 ‘附加选项’ 的效果,以折的不常用信息和操作项,减少普通用户负担,提升用户体验。在某些软件中此类窗口折叠效果,常用 “…按钮” 来触发。另一种折叠效果是,类似于QQ好友列表那样的,主要是为更有效的利用有限展示空间。
请添加图片描述
前阵子整理过《Qt/GUI /布局/在父窗中展示多个子窗》,其中在父窗口大小保持不变的情况下,我们可以使用Qt自动布局功能+hide/show操作来实现多个平行窗口的切换效果。因此本以为很容易就能实现这种折叠效果,但事与愿违,碰了点小钉子…

无法resize到小尺寸

如下代码,想着使用Qt布局配合hide/show操作就能完成折叠效果。但是却发现,在折叠操作时,resize回小尺寸却没有生效。

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->textEdit->hide(); 
    ui->label_step->setText("1");  //标记操作步骤
    //生效 /否则即使执行了hide操作,父窗在显示尺寸上也包含了textEdit大小
    this->resize(this->width(), ui->frame->height() + 2);  
}

void Widget::on_pushButton_moreInfo_clicked()
{
    if (ui->textEdit->isHidden())
    {
        ui->textEdit->show();
        ui->label_step->setText("2");
    }
    else
    {
        ui->textEdit->hide();
        ui->label_step->setText("3");
        //如下操作并没有起到预期效果
        this->resize(this->width(), ui->frame->height() + 2);
    }
}
QtDesigner 绘制实际运行效果
在这里插入图片描述在这里插入图片描述

在上述示例中,我们点击"更多"按钮,(步骤2)撑大父窗口后,再对父窗口执行hide+resize操作(步骤3)却没能缩小父窗口的尺寸。与《Qt/GUI /布局/在父窗中展示多个子窗》中遇到的问题,本质是一样的。这是为什么呢?

[virtual protected] void QWidget::resizeEvent(QResizeEvent *event)
This event handler can be reimplemented in a subclass to receive widget resize events //which are passed in the event parameter. When resizeEvent() is called, the widget //already has its new geometry. The old size is accessible through QResizeEvent::oldSize().

void Widget::resizeEvent(QResizeEvent *event) {
    qDebug() << event->oldSize() << event->size() << this->minimumSize();
}
//初始化过程触发
//QSize(-1, -1) QSize(407, 105) QSize(213, 105)
//展开操作触发
//QSize(407, 105) QSize(407, 311) QSize(213, 311)
//折叠操作时resize操作并没有触发resizeEvent事件

可以发现,minimumSize的尺寸在Qt的布局作用下发生了变化。当在步骤3中执行折叠操作时,由于要resize的尺寸小于minimumSize尺寸,因而操作无法生效。其解决方案,在 QWidget::minimumSize 成员属性中有说明:

minimumSize : QSize
This property holds the widget’s minimum size
The widget cannot be resized to a smaller size than the minimum widget size. The widget’s size is forced to the minimum size if the current size is smaller.
The minimum size set by this function will override the minimum size defined by QLayout. In order to unset the minimum size, use a value of QSize(0, 0).
By default, this property contains a size with zero width and height.

可行方案

经过上述分析,相应的代码修改为:

void Widget::on_pushButton_moreInfo_clicked()
{
    if (ui->textEdit->isHidden())
        ui->textEdit->show();
    else
    {
        ui->textEdit->hide();
        this->setMinimumSize(0, 0);
        this->resize(this->width(), ui->frame->height() + 2);
    }
}

修正后的代码,执行效果如下:
请添加图片描述
需要注意的是:在使用自动布局后,QWidget窗口的大小是由布局所管理的。如果您手动调用 resize 函数来设置 QWidget 窗口的大小,则可能会与自动布局相冲突,导致布局无法正确调整 QWidget 窗口的大小。

其他方案

其实Qt的控件库中,QToolBox 号称可以天然的支持这种折叠面板的效果,如QQ好友列表折叠和展开。但是原生的 QToolBox 并不适合实现本文描述的展示效果:它只能实现两个抽屉之间的互斥开关,不支持多个抽屉的同时打开,且当只有一个抽屉时无法将其关上。
在这里插入图片描述
关于QToolBox的使用或自定义QToolBox构建,可参见本博客下其他相关文章。此处不再赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud断路器

SpringCloud断路器 Hystrix 简介 hystrix对应的中文名字是“豪猪”&#xff0c;豪猪周身长满了刺&#xff0c;能保护自己不受天敌的伤害&#xff0c;代表了一种防御机制。 这与hystrix本身的功能不谋而合&#xff0c;因此Netflix团队将该框架命名为Hystrix&#xff0c;并使用…

2023最详细的接口测试用例设计教程,详细文档等你来拿

目录 一、接口测试流程 二、分析接口文档元素 三、如何设计接口测试用例 四、常用的接口测试用例覆盖方法 五、接口测试接口优先级 六、接口测试的设计思路分析 七、接口测试返回结果的比较 一、接口测试流程 1、需求讨论 2、需求评审 3、场景设计 4、数据准备 5、测试执…

sdf与timingCheck和后仿真

目录 1.Distributed delays 2.specify--endspecify 1.1 specify内部语法 2.sdf 2.1 sdf的格式 3.timingCheck和网表后仿真 4.关于负值delay sdf和 module 里面的specify--endspecify都可以对路径延时进行赋值和检查&#xff1b;HDL语言中的‘#()’也可以描述延时【叫做D…

没事千万别动生产服数据库 - 来自小菜鸟的忠告

阿里云官方参考文档 目录 背景一、环境部署二、目录规划三、操作步骤FAQ 背景 今天把一张 5500 多万条记录的表进行按年度拆分&#xff0c;本来打算将表数据拆分为 2020 年、2021 年、2022 年三张新表&#xff0c;提升原表查询效率&#xff0c;仅保留 2023 年数据。表拆分完毕…

【SpinalHDL快速入门】4.1、基本类型之Bool

Tips1&#xff1a; 由于SpinalHDL是基于Scala构建的&#xff0c;Scala本身自带类似变量Boolean&#xff0c;故在此要认准SpinalHDL中采用的是Bool而非Boolean&#xff1a; Bool&#xff08;大写的True和False&#xff09;&#xff1a;True表示1&#xff0c;False表示0Boolean&…

Vue3搭建

Vue3项目搭建全过程 vue create 项目名 选择手动吗&#xff0c;自定义安装 选择vue3 是否选择class风格组件 选择ts处理工具和css预处理器 Y 是否使用router的history模式 Y 选择css预处理语言 ;less 9.选择lint的检查规范 只使用EsLint官网推荐规范 使用EsLint官网推荐规…

MyBatis-plus(1)

基本概念: 一)开发效率也就是我们使用这款框架开发的速度快不快&#xff0c;是否简单好用易上手。从这个角度思考&#xff0c;每当我们需要编写一个SQL需求的时候&#xff0c;我们需要做几步 1)Mapper接口提供一个抽象方法 2)Mapper接口对应的映射配置文件提供对应的标签和SQL语…

论文笔记--LLaMA: Open and Efficient Foundation Language Models

论文笔记--LLaMA: Open and Efficient Foundation Language Models 1. 文章简介2. 文章概括3 文章重点技术3.1 数据集3.2 模型训练 4. 数值实验5. 文章亮点6. 原文传送门7. References 1. 文章简介 标题&#xff1a;LLaMA: Open and Efficient Foundation Language Models作者…

【自动化测试】--JUnit5

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启软件测试的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 Junit5简介 什么是Junit5 JU…

tomcat和undertow、jetty、netty的区别

记录一下&#xff0c;最近发现的几个容器的区别 tomcat简介 Tomcat&#xff1a;免费开源&#xff0c;轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。实际上Tomcat 部分是Apache 服务器的扩展&am…

十年历程:下定决心转向自动化测试/开发

目录 前言&#xff1a; 十年测试心路历程&#xff1a; 放弃了年薪二十万的offer&#xff0c;挑战自动化测试&#xff1a; 自动化测试心得&#xff1a; 自动化测试没用的误解&#xff1f; 关于测试开发 测试行业的现状 那么如何来全面的学习自动化测试呢&#xff1f; 前言&…

4.2 synchronized 解决方案

4.2 synchronized 解决方案 1、应用之互斥2、synchronized3、思考4、面向对象改进 1、应用之互斥 为了避免临界区的竞态条件发生&#xff0c;有多种手段可以达到目的。 阻塞式的解决方案&#xff1a;synchronized&#xff0c;Lock非阻塞式的解决方案&#xff1a;原子变量 本…

Linux网络基础 — 应用层

目录 应用层 再谈 "协议" 网络版计算器 HTTP协议 认识URL urlencode和urldecode HTTP协议格式 HTTP请求 HTTP响应 HTTP的方法 HTTP的状态码 HTTP常见Header 拓展知识&#xff08;了解&#xff09; 长链接 http周边会话保持 基本工具(http) 应用层 程序…

MOS管电源开关电路的缓启动功能是怎么实现的

先看一个电路&#xff1a; 其主要设计思路是使用MOS管来做一个开关&#xff0c;控制电源输出&#xff1b; 为什么选用MOS管&#xff1f; 这就涉及到MOS管的两个重要特性&#xff1a; 1.MOS管的导通电流大&#xff1b; 2.MOS管导通时内阻小&#xff0c;内部功耗低&#xff1b…

Probit模型、Logit模型、IV-Probit模型、IV-Probit模型

概述 Y β 1 X 1 β 2 X 2 ϵ i Y\beta_1X_1\beta_2X_2\epsilon_i Yβ1​X1​β2​X2​ϵi​ 边际效应&#xff1a;就是系数&#xff0c;即 β 1 \beta_1 β1​ 、 β 2 \beta_2 β2​ 解释&#xff1a;如&#xff0c;在控制其他变量&#xff08;条件&#xff09;不变的情况…

常用设计模式之单例模式

文章目录 饿汉式和懒汉式多线程中的懒汉式单例模式内存释放问题单例模式优缺点单例应用场景测试代码 饿汉式和懒汉式 单例模式是指在任何时候都保证只有一个类实例&#xff0c;并提供一个访问它的全局访问节点。 单例模式结构图&#xff1a; 解释&#xff1a;单例模式就是一…

罗湖区田心村旧改确认实施主体的公示,华润集团开发

深圳市罗湖区城市更新和土地整备局发布关于罗湖区笋岗街道田心村改造项目一期子项目2&#xff08;1-14、1-16、1-17地块&#xff09;确认实施主体的公示。 田心村改造项目位于罗湖区笋岗街道田心村&#xff0c;2012年4月&#xff0c;深圳市城市规划委员会建筑与环境艺术委员会2…

关于ElementPlus中的表单验证

关于ElementPlus中表单的校验规则&#xff0c;官网文档已经给出了&#xff0c;但是没有说明性文字&#xff0c;所以我想来记录一下&#xff0c;给出一些文字说明 ElementPlus中的简单校验 ElementPlus的表单的一般结构是&#xff1a; <el-form><el-form-item>&l…

(一)CSharp-Net框架

.NET框架由三部分组成&#xff1a; 1.编程工具。 2.基类库(BCL). 3.公共语言运行库(CLR) CLR 在运行时管理程序的执行&#xff0c;包括以下内容&#xff1a; 内存管理和垃圾收集。代码安全验证。代码执行、线程管理及异常处理。 NET 框架的特点以及其带来的好处&#xff1a…

web测试工程师的工作职责(合集)

web测试工程师的工作职责1 职责: 1、 负责数据平台产品的测试工作&#xff0c;参与产品需求分析&#xff0c;负责方案制定,并能预先评估项目风险&#xff0c;确保测试活动的顺利开展; 2、 深入理解系统内部的设计原理&#xff0c;并能从测试的角度提供优化意见; 3、 根据产品需…