QCoreApplication::quit()无法退出程序解决方法

前言

使用Qt一般是做带界面的桌面软件,然而我在使用Qt写后台服务程序的时候遇到一个问题,程序调用QCoreApplication::quit()无法正常退出程序,程序一直出于挂起状态。以下是我的错误代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//.h
#include <QObject>
class Test : public QObject
{
Q_OBJECT
public:
explicit Test(QObject *parent = nullptr);
virtual ~Test();
public slots:

};

//cpp

#include "test.h"

#include <QDebug>

#include <QCoreApplication>

Test::Test(QObject *parent) : QObject(parent)
{
//do something
if(something is wrong)
qApp->quit();
}

Test::~Test()
{
//释放内存
qDebug()<<"delete";
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test test;

return a.exec();
}

上述代码导致程序无法退出,一直导致程序在挂起状态。错误原因是quit()函数是用于退出Qt程序主线程的事件循环,进而结束程序。但是此处是在执行a.exec()之前就执行了quit(),也就是说此时还没有进入主线程的事件循环,所以此处调用quit()是无效的。正确代码如下:

解决方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//.h
#include <QObject>
class Test : public QObject
{
Q_OBJECT
public:
explicit Test(QObject *parent = nullptr);
virtual ~Test();
public slots:
};
//cpp
#include "test.h"
#include <QDebug>
#include <QCoreApplication>
#include <QTimer>
Test::Test(QObject *parent) : QObject(parent)
{
//do something
if(something is wrong)
QTimer::singleShot(1000,qApp,SLOT(quit()));
}
Test::~Test()
{
//释放内存
qDebug()<<"delete";
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test test;
return a.exec();
}

此处采用QTimer定时器,将quit()操作放在1秒之后,然后程序继续执行,就会进入主线程的事件循环,QTimer的timeout之后调用quit()这时就可以正确退出程序了。


QCoreApplication::quit()无法退出程序解决方法
http://yoursite.com/2019/07/23/QCoreApplication-quit-无法退出程序解决方法/
作者
还在输入
发布于
2019年7月23日
许可协议