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->exit()
。
【参考方案1】:
@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();
【讨论】:
谢谢!现在我明白为什么它不起作用了。我想退出应用程序的原因是在构造函数代码中,我确实检查了是否使用 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的主要内容,如果未能解决你的问题,请参考以下文章
退出时删除 QQuickView 会导致 Qt 应用程序冻结