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;
});

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 07:48:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 07:48:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 07:48:03       82 阅读
  4. Python语言-面向对象

    2024-04-29 07:48:03       91 阅读

热门阅读

  1. 行列视平台的应用

    2024-04-29 07:48:03       32 阅读
  2. 微信小程序常用的api

    2024-04-29 07:48:03       34 阅读
  3. CMUS狮身人面像(四)-构建语言模型

    2024-04-29 07:48:03       30 阅读
  4. python 贪吃蛇

    2024-04-29 07:48:03       27 阅读
  5. c/c++传值和传引用的区别

    2024-04-29 07:48:03       31 阅读
  6. Pytorch中保存模型的两种方法

    2024-04-29 07:48:03       30 阅读