如何在关闭 Qt 控制台应用程序之前运行我的析构函数?

问题描述 投票:0回答:2

我想在单击 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;
}
  1. 我想知道为什么它不运行我的析构函数。

  2. 如果我想运行它,如何运行?

我希望它在单击关闭按钮时输出

MyClass()
this line will not run.
~MyClass()

c++ windows qt
2个回答
0
投票

您可能想做这样的事情。我不确定它是否可以在 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()

0
投票

您应该使用 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.