关于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);
注意到 accept 和 reject 都是隐藏窗口
接下来我们看一下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时才会析构