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

news/2025/2/16 0:04:58/

文章目录

  • 概述
  • 无法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.ppmy.cn/news/246360.html

相关文章

地图实火!断货加印,限时折扣抢购通道开启

&#xff08;关注公众号点击图片三折购买《社交泛娱乐出海作战地图》&#xff09; 实火&#xff01; 融云自制《社交泛娱乐出海作战地图》 “WICC 泛娱乐出海嘉年华”最热单品 关注【融云全球互联网通信云】了解更多 《出海作战地图》线下首发立刻引爆现场&#xff0c;“如…

springboot源码分析-jar启动

概述 Spring Boot 提供了 Maven 插件 spring-boot-maven-plugin&#xff0c;可以方便的将 Spring Boot 项目打成 jar 包或者 war 包。 SpringBoot 是如何通过jar包启动的 java -jar做了什么&#xff1f;看看官网怎么说 If the -jar option is specified, its argument is the …

通达信l1l2行情接口是什么?

通达信l1l2行情接口是什么&#xff1f;L1L2是指L1L2范数&#xff0c;范数理解为”空间两点之间的距离“这个概念被扩展了。 权重w可以理解为高维向量&#xff0c;也可以理解为高维空间中的一个点。如果从这个点到原点的距离是欧洲距离&#xff0c;那就是L2范数&#xff0c;如图…

如何调用通达信l2行情接口?

如何调用通达信l2行情接口&#xff1f;今天小编&#xff0c;就用这三个场景说明一下&#xff0c;如下&#xff1a; 1、API平台生成公钥&#xff0c;发布公钥并提供给需要连接API的人员。 2、Tradex涵盖市场接收、访问、管理和定制&#xff0c;实现一揽子解决方式。 3、量化接…

东方财富、同花顺、大智慧、通达信的Level2行情接口哪个好?

其实Level2行情接口最主要的核心是逐笔委托和逐笔成交的买卖单数据&#xff0c;盘口数据转瞬即逝&#xff0c;如何能方便的在程序中调用到最全面的即时数据才是应该关心的内容。至于看盘&#xff0c;再好的眼神再快的人脑也比不过使用软件程序写出自己的交易方法让电脑的精准和…

运行通达信行情接口软件的电脑需要什么配置?

运行通达信行情接口软件电脑需要什么配置&#xff1f;目前除了机构之外&#xff0c;大部分的散户用的都是一些比较有名的电脑版股票软件&#xff0c;比如&#xff1a;通达信、同花顺、大智慧、东方财富等。通达信行情接口软件因为使用C语言编写&#xff0c;执行效率高&#xff…

通达信L2行情接口怎样破解?

有些投资者或工作室想使用通达信L2行情接口&#xff0c;但又不想另外去购买&#xff0c;那怎么办呢&#xff1f;最有效的方法就是破解它&#xff0c;那具体要怎么做呢&#xff1f; 要破解通达信L2行情接口&#xff0c;最简单的方法就是通过编程获取数据&#xff0c;然后自己编写…

通达信l1l2行情接口具体有什么区别?

通达信Level-2行情接口是相对于Level-1行情的&#xff0c;早些年&#xff0c;市场上只有Level-1行情&#xff0c;大家都是用Level-1行情做交易。 但是后来&#xff0c;随着经济的发展&#xff0c;以及国外经济金融市场的一些先进经验向本土市场的传播&#xff0c;大陆就开始向…