很多时候,软件的退出要向用户询问,以一个弹窗的形式让用户来选择是误点了“关闭”按钮,还是正真的想要退出。
对Qt程序来说,一般的思路是将退出提示的逻辑写到,窗口的虚函数:
void closeEvent(QCloseEvent *event) override;
但要注意的是:很多情况下,调用close()函数是无法结束应用程序的,它只能关闭窗口。调用close()后你还需要调用:
qApp->quit();
或者是:
qApp->exit(0);
qApp->quit()和qApp()->exit(0);
写在构造函数的里是没有效果的,你只能在程序初始化工作做完之后再来使用这些操作。
如果你确实需要在构造函数里加入退出程序的逻辑,有个简单的办法是使用定时器:
QTimer *myTimer = new QTimer();
myTimer->start(100);
connect(myTimer, &QTimer::timeout, this, [=](){this->close(); qApp->quit();});
在实际项目里还有一种情况是,程序启动的一开始就要退出,并且此时一般要求不显示主界面。比如说当程序已经启动时,再次启动就会弹窗提示,然后结束程序,或者该程序启动时必须连接某项服务,连不上就不能进行业务。
以上情况一般时要求弹框提示,不出现主界面,然后软件退出。
这时候只需要在退出的逻辑中将主窗口隐藏。
myWidget->setVisible(false);
提示:使用qApp需要包含头文件QApplication或QCoreApplication
一个简单的退出提示小例子:
void MainWindow::closeEvent(QCloseEvent *event)
{
if(QMessageBox::information(this, "提示","确定要退出吗?", QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes)
{
event->accept();
qApp->quit();
}
else
{
event->ignore();
}
}
qApp是一个宏,从这个宏我们可以看到,QCoreApplication有个单例函数
可以获取到一个指向应用程序的全局指针。
看到这里就能发现,这个全局指针,我也可以不用宏,自己去拿。
QCoreApplication *myAppInstance = QCoreApplication::instance();
myAppInstance = (QApplication *)myAppInstance;
myAppInstance->quit();