目录
Qt 实现关闭窗口触发事件
QT中窗口关闭自动销毁
参考:
Qt保存MainWindow的窗口布局,并在再次打开时显示
https://blog.youkuaiyun.com/qq_39417283/article/details/114024286
======================================
Qt 实现关闭窗口触发事件
https://blog.youkuaiyun.com/m0_60352504/article/details/124366494
Qt程序关闭前,有时候需要弹出一个确认窗口,如何实现呢?
当鼠标点击窗口右上角的关闭按钮时,会触发一个窗口关闭事件(QCloseEvent),只需要覆写窗口类的closeEvent(QCloseEvent *event)函数,就可以对此事件进行相应处理
用到的头文件
#include<QMessageBox>
#include<QCloseEvent>
编辑窗口类
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
//覆写closeEvent函数
void closeEvent(QCloseEvent *);
private:
Ui::MainWindow *ui;
};
源文件实现closeEvent(QCloseEvent *)函数
void MainWindow::closeEvent(QCloseEvent *e){
//窗口关闭时弹出的提示窗口
QMessageBox msgBox;
msgBox.setText("提示");
msgBox.setInformativeText("确认退出?");
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Ok);
int ret = msgBox.exec();
if(ret == QMessageBox::Ok){
//若用户点击确认,则接收这个事件,当前窗口会关闭
e->accept();
}else{
//若用户点击取消,则忽略这个事件,当前窗口不会关闭
e->ignore();
}
}
————————————————
版权声明:本文为优快云博主「百口可乐__」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/m0_60352504/article/details/124366494
QT中窗口关闭自动销毁
https://blog.youkuaiyun.com/u011555996/article/details/124786893
我们知道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())
......
});
————————————————
版权声明:本文为优快云博主「luckyone906」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u011555996/article/details/124786893