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

Posted

技术标签:

【中文标题】QT:如何退出应用程序并关闭 UI【英文标题】:QT: how to exit application and close UI 【发布时间】:2016-01-22 09:50:03 【问题描述】:

我尝试使用 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.

【问题讨论】:

你好像在a.exec()之前打电话给qApp-&gt;exit() 【参考方案1】:

@thuga 是对的。您遇到的问题是由错误代码引起的:您在构造函数之前调用了qApp-&gt;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();

【讨论】:

谢谢!现在我明白为什么它不起作用了。我想退出应用程序的原因是在构造函数代码中,我确实检查了是否使用 QsharedMemory 打开了另一个相关应用程序。在这种情况下,如果打开了相关应用程序。它将打开一个对话框,告诉用户另一个应用程序已打开以及他是否要关闭此应用程序。一旦他单击“是”,它将退出应用程序。那么在这种情况下,我应该在哪里实现这个检查 Qsharememory 并退出应用程序逻辑?主要是在 clsDownloadUpdateList w; 之后但在 w.show() 之前?谢谢 我理解你的目标有错吗? - 您希望此应用程序检查某些相关应用程序是否已在运行。如果它已经在运行 - 显示带有问题“是否要关闭相关应用程序?(是,否)”的对话框 - 如果“是” - 关闭它? 是的,维克多你完全理解我。那么我应该在哪里实现这个逻辑呢?【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

工作代码:

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

或者对于小部件:

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

【讨论】:

以上是关于QT:如何退出应用程序并关闭 UI的主要内容,如果未能解决你的问题,请参考以下文章

qt的程序异常退出 求救

退出时删除 QQuickView 会导致 Qt 应用程序冻结

如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?

如何在退出 Qt 应用程序时做一些事情

关闭并退出时崩溃

Qt 中的退出应用程序