Qt 窗口可见性 之 close函数和hide函数

news/2024/11/13 22:55:23/

close函数

基本功能

        close() 方法的主要功能是关闭窗口,并触发一系列与关闭相关的事件和信号。调用此方法后,窗口将不再可见,但窗口对象本身仍然存在,并且可以被再次显示(通过调用 show() 方法)。

事件处理
  • QCloseEvent:在调用 close() 方法时,Qt 会向窗口发送一个 QCloseEvent 事件。这个事件提供了一个机会,让开发者在窗口关闭之前执行一些清理工作或确认操作。
  • 事件处理函数:开发者可以通过重写 QWidget 类的 closeEvent(QCloseEvent *event) 方法来捕获并处理这个事件。在这个方法中,你可以决定是否接受关闭事件(即是否允许窗口关闭)。
void FormChild::closeEvent(QCloseEvent *event)
{qDebug() << "do closeEvent";//若不希望子窗口被关闭,则忽略event->ignore();//默认允许窗口关闭,有无此语句都可以//event->accept();
}
资源释放

        默认情况下,调用 close() 方法并不会立即释放窗口对象的资源。窗口对象仍然存在于内存中,并且可以通过调用 show() 方法再次显示。如果你希望窗口在关闭时立即被销毁并释放资源,你可以使用以下方法之一:

  • 设置属性:通过调用 setAttribute(Qt::WA_DeleteOnClose, true) 方法,你可以设置窗口在关闭时自动删除自己。这样,当窗口关闭时,Qt 会自动调用 deleteLater() 方法来销毁窗口对象。
  • 手动删除:另一种方法是手动删除窗口对象。这通常在你确定窗口不再需要时进行。你可以通过调用 delete 操作符来销毁窗口对象(但请注意,这样做之前需要确保没有其他指针指向该对象,以避免悬挂指针问题)。

hide函数

功能描述
  • 隐藏窗口:调用hide()函数会使窗口或小部件变得不可见。
  • 保留资源:虽然窗口被隐藏,但它仍然存在于内存中,并且其所有资源和状态(如大小、位置、内容等)都被保留。
  • 事件处理:隐藏后的窗口不会接收鼠标或键盘事件,但仍然可以接收某些特定的事件,如定时器事件。
使用场景
  • 临时隐藏:在某些情况下,你可能需要暂时隐藏一个窗口,然后在需要时再次显示它。例如,在显示一个弹出菜单时隐藏主窗口。
  • 资源管理:隐藏窗口而不是销毁它可以节省资源,因为重新创建一个窗口可能比显示一个已经存在的窗口要耗费更多的资源。

区别

功能不同
  • close():这个函数不仅隐藏窗口,还会触发一系列关闭事件。默认情况下,它会向窗口发送一个QCloseEvent事件,如果窗口接受了这个事件,close()函数会进一步隐藏窗口。此外,如果窗口设置了Qt::WA_DeleteOnClose属性,close()还会在隐藏窗口后删除它,释放其占用的资源。
  • hide():这个函数仅用于隐藏窗口,不会触发关闭事件,也不会删除窗口。隐藏后的窗口仍然存在于内存中,可以随时通过show()函数重新显示。
事件处理
  • 当调用close()时,窗口有机会通过重新实现closeEvent()函数来处理关闭事件,决定是否真的要关闭窗口。
  • hide()则不会触发任何事件,它只是简单地将窗口设置为不可见(并不是最小化)

资源释放

  • 如果窗口设置了Qt::WA_DeleteOnClose属性,并且调用了close()函数,那么窗口及其子对象将被删除,释放其占用的资源。
  • hide()不会释放任何资源,它只是将窗口隐藏起来。

联系

  • 隐藏效果:无论是close()还是hide(),它们都会使窗口变得不可见。然而,如前所述,close()在隐藏窗口后可能还会执行其他操作(如删除窗口)。
  • 调用关系:在Qt的源码中,close()函数在隐藏窗口时实际上调用了hide()函数。因此,从某种程度上说,close()在隐藏窗口方面的行为是依赖于hide()的。

使用场景

  • close():当你想要关闭一个窗口并释放其占用的资源时,应该使用close()函数。特别是当窗口设置了Qt::WA_DeleteOnClose属性时,close()会确保窗口被正确删除。
  • hide():当你只是想要暂时隐藏一个窗口,但保留其状态和资源以便稍后再次显示时,应该使用hide()函数。

代码案例: Qt 窗口可见性 之 工程案例-CSDN博客


http://www.ppmy.cn/news/1546773.html

相关文章

石油安全理论知识题库 考试宝在线刷题

一、单选题&#xff08;每题有4个选项&#xff0c;其中只有1个是正确的&#xff0c;将正确的选项号填入括号内&#xff09; 1.新修订的《中华人民共和国安全生产法》于&#xff08; &#xff09;正式实施。 A、2014年1月1日 B、2014年12月1日 C、2015年1月1日 D、2015年…

微信小程序官方评价组件wxacommentplugin下线后如何巧妙调用

在前一段时间微信小程序官方下线了评价组件后&#xff0c;无法再申请到了&#xff0c; 先来说说小程序什么情况下弹出评价&#xff1f; 1.官方邀请用户评价 用户通过搜索使用过小程序后&#xff0c;官方会邀请用户对小程序的使用体验进行评价。这个是系统随机的&#xff0c;…

AI技术赋能电商行业:创新应用与未来展望

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐步渗透到各行各业&a…

每日小练:Day2

1.乒乓球筐 题目链接&#xff1a;乒乓球筐__牛客网 题目描述&#xff1a; 这道题主要考察B盒是不是A盒的子集&#xff0c;我们可以通过哈希表来做 单哈希表 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stat…

Oracle 数据库创建导入

注意&#xff1a;本教程中的有些命令您可能并不熟悉&#xff0c;但没关系&#xff0c;只需按照说明一步一步创建示例数据库即可。在之后的教程中&#xff0c;会详细介绍每个命令。 1.创建新用户并授予权限 1.1.打开 首先&#xff0c;启动 SQL plus 程序的命令行&#xff1a;…

Java 实现自定义 LRU 缓存

一、引言 在现代软件系统中&#xff0c;缓存是提高性能的重要手段之一。LRU 缓存作为一种常用的缓存策略&#xff0c;能够根据数据的使用频率自动淘汰最近最少使用的数据&#xff0c;从而保持缓存的高效性。在 Java 中&#xff0c;虽然有一些现成的缓存框架可供使用&#xff0c…

PyQt5 加载UI界面与资源文件

步骤一: 使用 Qt Designer 创建 XXX.ui文件 步骤二: 使用 Qt Designer 创建 资源文件 步骤三: Python文件中创建相关类, 使用 uic.loadUi(mainwidget.ui, self ) 加载UI文件 import sys from PyQt5 import QtCore, QtWidgets, uic from PyQt5.QtCore import Qt f…

Git的使用(基础语句)

首先如果想要使用git的各项功能&#xff0c;我们要下载Git-2.40.1-64-bit.exe这个驱动程序&#xff0c;并安装它&#xff0c;这个资源我没有办法上传是因为有的博主已经上传过了&#xff0c;所以有VIP的或者有钱哥可以去csdn上自行下载&#xff0c;实在不行加我qq我发你4925396…