QT:如何退出应用程序并关闭UI

时间:2016-01-22 09:50:03

标签: c++ qt user-interface exit qapplication

我尝试使用qApp-> exit()退出应用程序并关闭UI。但是在qApp-> exit()执行后,我仍然无法使用UI。任何人都可以帮助找出原因?非常感谢。

#include "clsDownloadUpdateList.h"
#include <QApplication>
#include <qtranslator.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTranslator translator;
    translator.load("en-CN_upgrader");
    qApp->installTranslator(&translator);
    clsDownloadUpdateList w;
    w.show();

    return a.exec();
}

clsDownloadUpdateList::clsDownloadUpdateList(QWidget *parent) :
    QMainWindow(parent),
    _state(STOP),
    ui(new Ui::clsDownloadUpdateList)
{
    ui->setupUi(this);
    this->setWindowTitle("GCS Upgrader");
// other code
// here comes the code to exit application
            qApp->exit();
// but the UI is still there.
}

3 个答案:

答案 0 :(得分:2)

@thuga是对的。您遇到的问题是由错误的代码引起的:您在构造函数中调用qApp->exit()之前,您的应用程序尚未启动它的消息循环(a.exec())。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTranslator translator;
    translator.load("en-CN_upgrader");
    qApp->installTranslator(&translator);
    clsDownloadUpdateList w; // <- you call qApp->exit() right here, before a.exec();
    w.show();

    return a.exec();
}

答案 1 :(得分:1)

它对构造函数没有帮助,因为还没有启动事件循环。

在这种情况下,您可以使用QTimer :: singleShot(),超时等于零。它将导致在事件循环启动时调用所需的内容。最好使用初始化方法并在main中检查它:

Window w;
if ( !w.init() )
   return 1;
w.show();
return a.exec();

答案 2 :(得分:0)

工作代码:

#include <QMetaObject>
//...
QMetaObject::invokeMethod(qApp, "quit",
    Qt::QueuedConnection);

或小部件:

QMetaObject::invokeMethod(this, "close",
    Qt::QueuedConnection);