QT中窗口关闭自动销毁的实现示例

目录
  • qt关于窗口关闭触发函数/信号
    • 方法一、
    • 方法二、

我们知道c++内存管理的一个规则:new出来的对象,一定要delete。

我们实现一个弹窗的时候,有时候继承widget,有时候继承dialog。不管哪种,窗体调用show方法后,不可能直接delete。

当然,new该窗体的时候,指定了父对象,就可以不用显示调用delete,它会随着父对象的销毁而销毁。

那这时候,关闭弹窗的操作,就仅仅是隐藏了。为了实现真正的delete。我们需要设施窗口的一个属性 DeleteOnClose,具体方法如下:

setAttribute(Qt::WA_DeleteOnClose, true);

QT 窗口创建时,无论是模态或者是非模态的,可以通过设置窗体属性来进行销毁设置,设置该属性后,窗体如果关闭,窗体申请的内存会立即销毁。范例:

    QWidget *qui = new QWidget;
    qui->setTitle("新窗体测试");
    qui->setAlignment(Qt::AlignCenter);
    qui->setAttribute(Qt::WA_DeleteOnClose, true);
    qui->show();

窗体gui关闭后,gui所占用的内存会进行释放。

qt关于窗口关闭触发函数/信号

方法一、

窗口右上角的X按键会导致其在不给出任何提示的情况下直接退出,
当点击右上角的x按键时,会触发Qt中的一个事件处理函数:void QWidget::closeEvent ( QCloseEvent * e ),默认情况该函数无任何提示性消息,如果需提示则需要重写该函数

void Dialog::closeEvent ( QCloseEvent * e )
{
    if( QMessageBox::question(this,
                             tr("Quit"),
                             tr("Are you sure to quit this application?"),
                              QMessageBox::Yes, QMessageBox::No )
                   == QMessageBox::Yes){
        e->accept();//不会将事件传递给组件的父组件

        qDebug()<<"ok";
    }
    else
      e->ignore();  
}

说明:

事件的ignore函数表示忽略事件,将其传到父组件进行处理
事件的accept函数表示接受事件,组件自己进行处理,不会将事件传递给父组件
但是在这个closeEvent函数中,这两个函数尤其不一样的理解:对于窗口关闭QCloseEvent事件,
调用accept()意味着 Qt 会停止事件的传播,窗口关闭;
调用ignore()则意味着事件继续传播,即阻止窗口关闭。
此外如果需要直接退出某个应用程序,可以直接调用Qt中的一个全局指针:qApp ,全局指针qApp指向全局的QApplication对象。

//在需要停止程序运行的位置直接加入如下代码
#include <QtGui/QApplication>
...
  qApp->quit();

说明:

qApp是一个全局的函数,可以在Qt说明文档中直接找到,不是main函数定义的QApplication对象(QApplication对象也可以退出,使用 app->exit(0);或者 app->quit();具体可以参考【1】)
qApp->quit()关闭的是整个应用程序,不只是窗口,
一般情况下关闭窗口应用程序会直接退出,如果要求关闭窗口时,应用程序不退出,则需要设置QApplication的属性:
QApplication::setQuitOnLastWindowClosed(false);

方法二、

QWidget的close槽函数是像widget发送QCloseEvent,如果widget未设置Qt::WA_DeleteOnClose标志的话,将隐藏widget,并不会销毁相关资源。如果设置了该标志,那么会再发送destroy信号,销毁相关资源。

(多说一句:QWindow的close槽是调用destroy来销毁窗口资源的。不过我们一般不直接使用QWindow。)

Qt帮助文档中的介绍:

调用close()方法后首先它会向widget发送一个关闭事件(QCloseEvent)。如果widget接受了关闭事件(QCloseEvent),窗口将会隐藏(实际上调用hide())。
如果widget不接受关闭事件,那么窗口将什么也不做。默认情况下widget会接受关闭事件,我们可以重写QCloseEvent事件,可以选择接受或者不接受。

如果widget设置了Qt::WA_DeleteOnClose属性,widget将会被释放。不管widget是否可见,关闭事件都会传递给widget。即接收到QCloseEvent事件后,
除了调用hide()方法将窗口隐藏,同时会调用deleteLater()方法将窗口释放掉,不会再占用资源。

所以说调用close()并不一定就会将窗口对象销毁。而只有设置了 Qt::WA_DeleteOnClose属性才会删除销毁。如果这个属性没有设置,close()的作用和hide(),
setvisible(false)一样,只会隐藏窗口对象而已,并不会销毁该对象。

这样的话我们可以给QLabel(拿它当一个例子)设置Qt::WA_DeleteOnClose

QLabel *label = new QLabel;
label->setAttribute(Qt::WA_DeleteOnClose);

之后用connect使用label的destroyed信号绑定一个槽函数即可

connect(label, &QLabel::destroyed, this, [=]() {
    QString file_path = QFileDialog::getSaveFileName(this, "save file", "tmp.png", "(*.png);;all files(*.*)");
        if(!file_path.isEmpty())
        ......
});

到此这篇关于QT中窗口关闭自动销毁的实现示例的文章就介绍到这了,更多相关QT 窗口关闭自动销毁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PyQt5每天必学之关闭窗口

    最简单的关闭一个窗口的方法是点击标题栏上的 x 标志.但是,在下面的例子中,我们将展示如何通过编程来控制关闭窗口.我们将使用PyQt5的信号/槽. 以下是我们在例子中使用到的 QPushButton 控件的构造方法. QPushButton(string text, QWidget parent = None) text 参数是在按钮上显示的文本.parent 要将按钮控件放在哪里.在下面的例子中我们要将按钮控件放到 QWidget里.一个应用程序的窗口控件可以形成一个分层结构,在这个层次,大多

  • QT中窗口关闭自动销毁的实现示例

    目录 qt关于窗口关闭触发函数/信号 方法一. 方法二. 我们知道c++内存管理的一个规则:new出来的对象,一定要delete. 我们实现一个弹窗的时候,有时候继承widget,有时候继承dialog.不管哪种,窗体调用show方法后,不可能直接delete. 当然,new该窗体的时候,指定了父对象,就可以不用显示调用delete,它会随着父对象的销毁而销毁. 那这时候,关闭弹窗的操作,就仅仅是隐藏了.为了实现真正的delete.我们需要设施窗口的一个属性 DeleteOnClose,具体方法

  • Qt中PaintEvent绘制实时波形图的实现示例

    目录 绘制思路 1:接收硬件传入的数据 2:定时器动态刷新页面 3:真实数据处理 第一步:每进行一次数据更新,都需要剔除超时显示数据. 第二步:筛查有效数据,并记录 4:图形绘制 上一篇文章讲述了如何使用控件进行波形图绘制,虽然很方便,但是也有一些无法避免的问题,比如说:动态绘制图形时,想要流畅的进行波动,就必须按照特定的时间实时更换数据. 接来下,我们采用在paintEvent中绘制的方式进行实时波形图绘制,首先,我们先展示下显示效果吧! 数据来源依旧是硬件传入的实时数据,如下: [0, 3,

  • jsp页面中窗口关闭,退出的方式分享

    1.采用javascript 复制代码 代码如下: <input type="button" value="关闭窗口" onclick="javascript:window.close()"> 或者: 复制代码 代码如下: <input type="button" value="关闭窗口" onclick="window.close()"> <input t

  • JS中showModalDialog关闭子窗口刷新主窗口用法详解

    本文实例讲述了JS中showModalDialog关闭子窗口刷新主窗口用法.分享给大家供大家参考,具体如下: 网上找了好长时间 大都是window.opener.location.reload(),等等 都不是我想要的 最后终于发现了一个 想知道的就往下看看吧 showModalDialog和showModelessDialog 一.showModalDialog和showModelessDialog有什么不同? showModalDialog:被打开后就会始终保持输入焦点.除非对话框被关闭,否

  • C# Winform中实现主窗口打开登录窗口关闭的方法

    在使用C#进行Winform编程时,我们经常需要使用一个登录框来进行登录,一旦输入的用户名密码登录成功,这时登录窗口应该关闭,而且同时打开主程序窗口.该如何来实现呢? 乍一想,很简单啊,打开主窗口就用主窗口的Show()方法,而关闭登录窗口就用登录窗口的Close()方法即可.即代码如下: Program.cs中代码: 复制代码 代码如下: Application.Run(new FormLogin()); 登录窗口(FormLogin)代码: 复制代码 代码如下: private void b

  • 网页中可关闭的漂浮窗口实现可自行调节

    注释部分为广告的左右调节,可以自行设定 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <

  • vuejs中监听窗口关闭和窗口刷新事件的方法

    1.使用window.onunload之类的API window.onbeforeunload = function (e) { e = e || window.event; // 兼容IE8和Firefox 4之前的版本 if (e) { e.returnValue = '关闭提示'; } // Chrome, Safari, Firefox 4+, Opera 12+ , IE 9+ return '关闭提示'; }; 2.在生命周期钩子中注册监听事件 methods: { beforeun

  • VUE中setTimeout和setInterval自动销毁案例

    在Vue的大型单页应用中,在某个路由下,经常会出现需要延迟执行(setTimeout)或者间隔之心(setInterval)的函数,但是每次在页面destroy之前,都必须手动清理掉. 正常代码如下: beforeDestroy() { this._timer && clearTimeout(this._timer); } 但是如果一不小心,就会忘记,会造成意想不到的情况,那么有什么办法能避免这种情况吗? 当然有,那就是重新写一个setTimeout的方法(或者干脆劫持window.set

  • Qt中CQGUI框架之阴影圆角窗口实现

    大家好,我是IT文艺男,来自一线大厂的一线程序员 今天给大家讲解基于C++/Qt的CQGUI框架的阴影圆角窗口实现,实现效果如下图所示:: CQGUI开发环境:: Microsoft Visual Studio 2019 Qt5.15.1 步骤如下: 一.继承关系 class LoginPanel : public QDialog 二.窗口属性 setAttribute(Qt::WA_TranslucentBackground); //设置顶层面板背景透明 setWindowFlags(Qt::

  • JS针对浏览器窗口关闭事件的监听方法集锦

    本文实例总结了JS针对浏览器窗口关闭事件的监听方法.分享给大家供大家参考,具体如下: 方式一:(适用于IE浏览器,而且刷新不提示,只在点击浏览器关闭按钮的时候提示) <script type="text/javascript"> window.onbeforeunload=onclose; function onclose() { if(event.clientX>document.body.clientWidth&&event.clientY<

随机推荐