0

我尝试使用 qApp->exit() 退出应用程序并关闭 UI。但我失败了 qApp->exit() 执行后用户界面仍然存在。任何人都可以帮助弄清楚为什么?多谢。

#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.
}
4

3 回答 3

2

@thuga 是对的。您遇到的问题是由您的错误代码引起的:您qApp->exit()在构造函数中调用 before ,您的应用程序尚未开始它的消息周期(by 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();
}
于 2016-01-22T09:56:33.930 回答
1

它不会在构造函数中为您提供帮助,因为尚未启动事件循环。

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

Window w;
if ( !w.init() )
   return 1;
w.show();
return a.exec();
于 2016-01-22T09:59:38.873 回答
0

工作代码:

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

或者对于小部件:

QMetaObject::invokeMethod(this, "close",
    Qt::QueuedConnection);
于 2016-01-22T10:21:06.233 回答