我想在单击 Qt 控制台应用程序的关闭按钮之前运行我的析构函数。我在 stackoverflow 上找到了这个,在 Qt 控制台场景中未调用析构函数 .
我尝试过获取返回值,并返回之后的值。但没有任何帮助。
class MyClass
{
Q_OBJECT
public:
MyClass()
{
qDebug() << "MyClass()";
}
~MyClass()
{
qDebug() << "~MyClass()";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass my;
int ret = a.exec();
qDebug() << "this line will not run.";
return ret;
}
我想知道为什么它不运行我的析构函数。
如果我想运行它,如何运行?
我希望它在单击关闭按钮时输出
MyClass()
和 this line will not run.
和 ~MyClass()
。
您可能想做这样的事情。我不确定它是否可以在 Windows 上运行,因为我现在没有它,但它可以在 Linux 上运行。
#include <signal.h>
#include <QCoreApplication>
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass()
{
qDebug() << "MyClass()";
}
~MyClass()
{
qDebug() << "~MyClass()";
}
};
void SigInt_Handler(int)
{
qDebug() << "Interrupt received";
qApp->quit();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass my;
signal(SIGINT, &SigInt_Handler);
int ret = a.exec();
return ret;
}
如果您在其中使用
MyClass
宏,您的 QObject
也应该扩展 Q_OBJECT
。
按下
Ctrl+C
时,将打印:
Interrupt received
~MyClass()
您应该使用 SetConsoleCtrlHandler 函数。在下面的示例中,按下控制台关闭(“X”)按钮后,将调用 aboutToQuit 插槽和 QMediaDownloader 析构函数:
#include <QtCore/QCoreApplication>
#include <windows.h>
#include "downloader.h"
BOOL WINAPI QuitHandlerRoutine(_In_ DWORD dwCtrlType)
{
qApp->quit();
return TRUE;
}
int main(int argc, char *argv[])
{
::SetConsoleCtrlHandler(QuitHandlerRoutine, TRUE);
QCoreApplication a(argc, argv);
QMediaDownloader downloader;
QObject::connect(&a, &QCoreApplication::aboutToQuit, &downloader, &QMediaDownloader::aboutToQuit);
return a.exec();
}