2016-01-22 83 views
0

我试图使用qApp-> exit()退出应用程序并关闭UI。但是我失败了,在qApp-> exit()执行后,UI仍然存在。任何人都可以帮忙弄清楚为什么?非常感谢。QT:如何退出应用程序并关闭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

你似乎调用'qApp- >在'a.exec()'前退出()'。 – thuga

回答

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(); 
} 
+0

谢谢!现在我明白为什么它不起作用。我想退出应用程序的原因是在构造函数代码中,我没有检查是否使用QsharedMemory打开了另一个相关的应用程序。在这种情况下,如果相关的应用程序被打开。它将打开一个对话框,告诉用户其他应用程序已打开以及是否要关闭此应用程序。一旦他点击“是”,它将退出应用程序。所以在这种情况下,我应该在哪里实现这种检查Qsharememory并退出应用程序逻辑?在main中,可能在clsDownloadUpdateList之后;但在w.show()之前?谢谢 –

+0

我理解你的目标是错的吗? - 您希望此应用程序检查某个相关应用程序是否已在运行。如果它已经在运行 - 显示对话框中有一个问题“是否要关闭相关的应用程序?(是,否)” - 如果“是” - 关闭它? –

+0

是的,维克多你完全理解我。那么我应该在哪里实现这个逻辑? –

1

它不会帮助你在构造函数中,因为没有事件循环开始。

在这种情况下,您可以使用QTimer :: singleShot(),其超时值等于零。它会导致在事件循环开始时调用你需要的东西。此外,它是使用初始化方法,并检查它的主要不错的主意:

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

工作代码:

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

或为小部件:

QMetaObject::invokeMethod(this, "close", 
    Qt::QueuedConnection); 
相关问题