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

2023-11-11

概述

本文旨在,实现如下所示的显示或隐藏 ‘附加选项’ 的效果,以折的不常用信息和操作项,减少普通用户负担,提升用户体验。在某些软件中此类窗口折叠效果,常用 “…按钮” 来触发。另一种折叠效果是,类似于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构建,可参见本博客下其他相关文章。此处不再赘述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • C++:头文件中全局函数的多重定义错误

    该函数是全局的 在头文件中定义 暂时地我想把它留在那里 头文件还构成一个具有内联函数的特定类 其中一个函数调用this全局函数 源文件不包含任何有问题的全局函数 有关错误原因的任何提示吗 如果有人感兴趣的话我可以发布代码 mainwindo
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 通过CMake实现Qt项目

    我正在尝试通过 Cmake 构建并运行非常简单且基本的 Qt 示例 删除 pro 文件 以下是Qt项目的代码 自动生成的Qt项目的目录结构为 Cmake my project name headers mainwindow h source
  • 如何在 QT 安装程序框架中区分每用户安装与系统范围安装?

    我正在使用一些名为 pgModeler 的应用程序 它的当前版本提供了一个基于 QT 安装程序框架的安装程序 Windows 上该安装程序的问题是它安装每个用户的开始菜单条目 https github com pgmodeler pgmod
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • Qt 人工鼠标点击无法正常工作

    小玩具应用程序可以在这里找到 http gist github com 517445 http gist github com 517445 我正在尝试将人工鼠标事件发送到小部件 我使用QApplication sendEvent为此 接下
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap

随机推荐

  • HBase介绍(列存储)

    HBase介绍 列存储 2013 11 26 23 25 5871人阅读 评论 2 收藏 举报 分类 云存储 2 Hbase简介 started by chad walters and jim 2006 11 G release paper
  • FPGA-UART串口通信

    目录 前言 1 UART串口的介绍 2 实验开始前一些参数的计算 3 UART通信的时序 4 代码部分 1 接收部分代码 2 发送部分的代码 前言 本篇文章是为了记录自己FPGA的学习过程 不完全正确 仅供参考 1 UART串口的介绍 ua
  • 02守护进程学习之创建守护进程的七步骤及其分析

    02守护进程学习之创建守护进程的七步骤及其分析 与守护进程相关的文章 01守护进程学习之会话的概念和创建会话 包含Linux下相应id的总结一览 02守护进程学习之创建守护进程的七步骤及其分析 03守护进程学习之创建守护进程的代码例子 1
  • unicode,decode,encode在python的作用

    字符串在Python内部的表示是unicode编码 因此 在做编码转换时 通常需要以unicode作为中间编码 即先将其他编码的字符串解码 decode 成unicode 再从unicode编码 encode 成另一种编码 即 其他编码 g
  • 爬取起点网站图书信息(书名、作者、简介、图片url)

    爬取qidian网站图书信息 书名 作者 简介 图片url import requests from lxml import etree import json class BookSpider object def init self s
  • 华为s5720s-28p-si-ac加睿易路由器VLAN路由设置

    华为s5720s 28p si ac加睿易路由器VLAN路由设置 1 华为交换机初始化设置好WEB接口 2 自带易维WEB版划分VLAN 3 制作好VLAN网关 4 设置好相关接口 5 设置好DHCP以便分VLAN能自动获取到地址 6 进入
  • JS控制台报错Uncaught TypeError Cannot read properties of null (reading ‘appendChild‘);的解决方法

    当控制台出现Uncaught TypeError Cannot read properties of null reading appendChild 解决方法 将html文件中的script标签放在最下面或者中间
  • gethostbyname ()函数的使用

    gethostbyname 函数 根据主机名获取主机信息 用域名或者主机名获取地址 操作系统提供的库函数 函数原型 struct hostent gethostbyname const char hostname hostent结构体 st
  • Chrome下载文件错误:收到了来自服务器的重复标头

    在Chrome浏览器中下载文件时出现错误 收到了来自服务器的重复标头 然而在IE和Firefox浏览器中则不会出现此错误 经上网查看各位前辈的记录后 找到了自己项目的原因 response setHeader Content disposi
  • 使用Express快速搭建静态资源服务器

    有时候 客户端程序实现了某些功能需要与服务端联调 比如从服务器下载一些静态资源文件 XML JSON EXE HTML JS CSS等 像前文提到的场景 测试Electron程序的自动升级功能 我们介绍了如何使用Minio 不用写一行代码就
  • python-数据可视化-使用API

    使用Web应用程序编程接口 API 自动请求网站的特定信息而不是整个网页 再对这些信息进行可视化 一 使用Web API Web API是网站的一部分 用于与使用具体URL请求特定信息的程序交互 这种请求称为API调用 请求的数据将以易于处
  • 【知识分享】数据结构的应用——链表

    背景 对于数据结构 其实学过C语言的都不陌生 无外乎就队列 栈 二叉树等等这些 但其实对于初学者最困惑的不是数据结构是怎么样的 而是数据结构有什么用 我自己也是工作好几年后才体验到数据结构的快乐 所以本系列文章重点从应用场景切入 让大家理解
  • android 源码分析

    感谢网友banketree的收集 压缩包的内容如下 1 360新版特性界面源代码 实现了360新版特性界面的效果 主要涉及到Qt的一些事件处理与自定义控件 但源码好像是c 2 aidl跨进程调用 服务端onBind暴露 然后客户端bindS
  • 架构师日记-软件工程里的组织文化

    一 引言 本文是京东到家自动化测试体系建设过程中的一些回顾和总结 删减了部分系统设计与实践的章节 保留了组织与文化相关的内容 整理成文 以飨读者 下面就以QA Quality Assurance 的视角来探讨工作中经常面临的问题与挑战 关于
  • java 代码走查_java代码走查计划书

    java代码走查计划书 由会员分享 可在线阅读 更多相关 java代码走查计划书 8页珍藏版 请在人人文库网上搜索 1 WATER Corporation 代码走查计划书Version 2 0XXX2012 3 20文档修改记录版本号主要作
  • Linux结构,ls命令,cd命令,绝对路径和相对路径,命令类型,环境变量

    Linux结构 软件 IDE shell 软件 库 一个系统调用 可执行程序无法独立执行 library API 内核 通用管理软件 平台 kernel 底层 硬件 在单个CPU上 硬件资源独立 IDE 集成的开发环境 可以让程序员开发程序
  • 【Flask&MySQL】ORM模型的CRUD操作(十二)

    CRUD是 crud是指在做计算处理时的增查改删 增加 Create 读取 Read 更新 Update 删除 Delete 几个单词的首字母简写 crud主要被用在描述软件系统中数据库或者持久层的基本操作功能 一 添加操作 1 创建视图函
  • Maven本地仓库有jar包却无法导入项目

    本地的maven仓库有jar包 setting文件配置没问题 仓库路径没问题 但是无法导入到项目中 任务中总是显示在下载 从网上找了各种方法 其中一个 将本地仓库中的所有 remote repositories 文件删除 解决了问题 记录一
  • layuiajax提交表单控制层代码_表单提交中的post方法和get方法

    我们在Web表单提交 常常需要选择提交方法 这时我们会用到GET和POST方法 但关于它们之间的区别你又知道多少 今天我们就来了解它们 这两方法其实是HTTP协议中的请求方法 关于HTTP协议可以阅读之前我写的 解密Web通信协议 超文本传
  • Qt/GUI/布局/实现窗口折叠效果/且在操作时父窗口尺寸跟随变动

    文章目录 概述 无法resize到小尺寸 可行方案 其他方案 概述 本文旨在 实现如下所示的显示或隐藏 附加选项 的效果 以折的不常用信息和操作项 减少普通用户负担 提升用户体验 在某些软件中此类窗口折叠效果 常用 按钮 来触发 另一种折叠