Qt开发 , new一个QDialog窗口,点击关闭按钮,内部定义QTimer指针未释放 同时 析构函数也未调用问题

本文主要是介绍Qt开发 , new一个QDialog窗口,点击关闭按钮,内部定义QTimer指针未释放 同时 析构函数也未调用问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在Qt中,当创建一个QDialog的实例并显示它时,按下关闭按钮(或点击窗口右上角的“X”按钮)会触发窗口的关闭事件,但并不会立即调用其析构函数。这是因为Qt的窗口部件管理内存的方式是基于引用计数的,并且QDialog(以及所有QWidget子类)默认的行为是隐藏窗口而不是删除它。

        即使窗口看起来关闭了,QDialog对象仍然存在于内存中,除非显式地删除它。因此,任何在QDialog内部定义的定时器(或其他资源)都会继续运行,直到你采取一些措施来停止它们。

解决办法:

方法1、使用Qt::WA_DeleteOnClose、
dialog = new Dialog();
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
方法2、连接finished信号
当QDialog关闭时,它会发出一个finished信号。dialog = new Dialog();
dialog->show();
connect(dialog, &QDialog::finished, [this](){delete dialog;dialog = nullptr;
});
方法3、使用deleteLater

        这将把对象标记为待删除,并会在事件循环的下一个迭代中删除它。这通常用于确保在对象不再被直接使用时安全地删除它。

dialog = new Dialog();
dialog->show();
connect(dialog, &QDialog::finished, [this](){dialog->deleteLater();  dialog = nullptr;
});

这篇关于Qt开发 , new一个QDialog窗口,点击关闭按钮,内部定义QTimer指针未释放 同时 析构函数也未调用问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945684

相关文章

汽车行业软件开发V 模型与医疗行业异同,与传统瀑布开发模型区别

软件开发在汽车和医疗行业 V 模型的异同 V 模型是一种软件开发过程中的验证和确认模型,它被用来表示软件开发的各个阶段和它们的验证/ 确认活动。 在汽车和医疗行业中,V模型的使用有一些相似之处,但也有一些不同之处。 相同之处: 都使用V 模型来表示软件开发的过程,包括需求分析、 设计、 编码、 测试和维护等阶段。 都强调验证和确认活动的重要性,以确保软件的质量和可靠性。 都可能涉及到单元测试

QML开发经验之启动方式-文件路径-屏幕适配

文章目录 QML启动方式文件路径多分辨率适配图片适配文字适配背景适配 在QML开发的过程中有很多知识点和小技巧看似不起眼,但是如果没能掌握会对开发进度和产品效果产生极大的影响。这里就介绍一下常用的三个知识点,分别是:1.QML启动方式 2.文件地址的访问方式 3.如何适配各种尺寸的屏幕。 QML启动方式 QML程序有两种启动方式: QQuickView 搭配Item作为根

Python3.4内置函数

[color=green][size=large] Python的类库直到现在已经非常丰富,提供了各个不同服务使用的接口,具体介绍如下: 1. Python类库包含了非常多的组件,数据类型部分构成了python语言核心的一部分,例如数字和列表(List),对于这些类型,python语言在语义的层面上定义了这些字面形式,但并不是完全的定义,这些核心包也包含了一些内置函数和异常部分,对象可以使

Lucene4.3进阶开发之纯阳无极(十九)

[b][color=red][size=x-large]原创不易,转载请务必注明,原创地址,谢谢配合! [url]http://qindongliang.iteye.com/blog/2164583[/url] [/size][/color][/b] [b][color=green][size=large]Lucene内置很多的分词器工具包,几乎涵盖了全球所有的国家和地区,最近散仙,在搞多语

Spring Boot开发之弄月吟风 (三)

[img]http://dl2.iteye.com/upload/attachment/0107/8585/8962295b-3ae5-39a8-bc99-a6a25c83fa7c.jpg[/img] [b][color=green][size=large]今天来看下,如何在Spring Boot中使用热加载和集成Velocity,废话不多说,直接看下面的maven的pom依赖: [/size

Spring Boot开发之明月千城(一)

[img]http://dl2.iteye.com/upload/attachment/0107/8585/8962295b-3ae5-39a8-bc99-a6a25c83fa7c.jpg[/img] [b][color=green][size=large]最近数据分析的项目也即将告一段落了,中间也积累了很多知识,特此记录一下。其中用的最爽的Web组合开发就是Intellij IDEA

Apache Pig和Solr问题笔记(一)

记录下最近两天散仙在工作中遇到的有关Pig0.12.0和Solr4.10.2一些问题,总共有3个,如下: (1)问题一: 如何Pig中使用ASCII和十六进制(hexadecimal)的分隔符进行加载,和切分数据? 注意关于这个问题,在Pig中,会反应到2个场景中, 第一: 在Pig加载(load)数据时候 。 第二: 在Pig处理split,或则正则截取数据的时候。 先稍微说下,

【LeetCode】【滑动窗口】【双指针】长度最小的子数组

题目:209. 长度最小的子数组 - 力扣(LeetCode) 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 腾讯微信搜索团队一面的题,一模一样,用两个指针记录滑动窗口的头和

你不知道的Java的split的小问题

[size=medium] 有时候,我们的一些业务数据,有些定义的是按某个分割符分割数据,然后一行一行的,处理这种数据时候,要务必小心,因为它简单,不用维护类似json格式的数据或者一个对象,而是直接通过下标位置来访问数据的,相信这种场景大家也都接触过,当然弊端也是显而易见的,如果位置放错或者代码使用不当,都会造成一些问题,所以使用这种方式时,一会都会约定一些内容,比如行分隔符,列分割符等,下面

jdk安装多个版本,但是java -version显示最早安装的版本,换掉Path或者JAVA_HOME不生效问题

问题一:当你的电脑上又多个jdk版本,如17 或者8时,使用命令行 java -version显示最早安装的,如下图所示:环境变量配置的17,但是命令行显示的是8。 原因:windows电脑装jdk17后 会在你的环境变量当中的path开头 自动加上了 C:\ProgramData\Oracle\Java\javapath; 这样一个配置。 导致你后续如果安装jdk17然后重新配置了JAVA