Qt Dialog退出事件

关于Dialog退出事件思考

首先我们来看下Dialog的成员函数

cpp 复制代码
// 构造函数
QDialog::QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());

// 模态显示窗口
[virtual slot] int QDialog::exec();
// 隐藏模态窗口, 并且解除模态窗口的阻塞, 将 exec() 的返回值设置为 QDialog::Accepted
[virtual slot] void QDialog::accept();
// 隐藏模态窗口, 并且解除模态窗口的阻塞, 将 exec() 的返回值设置为 QDialog::Rejected
[virtual slot] void QDialog::reject();
// 关闭对话框并将其结果代码设置为r。finished()信号将发出r;
// 如果r是QDialog::Accepted 或 QDialog::Rejected,则还将分别发出accept()或Rejected()信号。
[virtual slot] void QDialog::done(int r);

注意到 acceptreject 都是隐藏窗口

接下来我们看一下Dialog的返回值

cpp 复制代码
// 创建对话框对象
Dialog dlg;    
int ret = dlg.exec();
if(ret == QDialog::Accepted)
{
    qDebug() << "accept button clicked...";
}
else if(ret == QDialog::Rejected)
{
    qDebug() << "reject button clicked...";
}
else
{
    // ret == 666
    qDebug() << "done button clicked...";
}

点击右上角的关闭按钮后返回的是QDialog::Rejected

一般而言我们会设置关闭按钮的事件为close(),这里会调用CloseEvent事件,因此可以重写覆盖CloseEvent,从而得到我们想要的效果

cpp 复制代码
void Dialog::slotCloseBtn()
{
	this->close();
}

void Dialog::closeEvent(QCloseEvent *event)
{
	// 设置close后就会执行这里的事件
	QDialog::accept();
	// this->reject();
	// this->done(123);
}

当然还有一种例外,当按下ESC,不会走closeEvent,那么我们需要重写覆盖reject事件

cpp 复制代码
void Dialog::reject()
{
	// do something
    QDialog::reject();
}

此外,只有设置**setAttribute(Qt::WA_DeleteOnClose);**在关闭Dialog时才会析构

相关推荐
码行山野赴时序归途3 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55233 小时前
单体项目编写思路和落地形式
java·开发语言
计算机毕设定制辅导-无忧学长4 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台
Ivanqhz4 小时前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
m0_734571764 小时前
深入理解C++ RAII
开发语言·c++
泡海椒4 小时前
jquick-pdf 表格实战:动态数据 PDF 报表生成
java·开发语言·pdf
aramae4 小时前
模拟实现memset()(C语言)
c语言·开发语言·后端
wuyk5555 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
船厂电气自动化ai大模型5 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
lv__pf6 小时前
seata【实战 msb】
java·开发语言·后端