MainWindows::MainWindow(QWidget *parent) :
QMainWindow(parent) , ui(new Ui::MainWindow) {
ui->setupUi(this);
some initialization code here
}
如果初始化失败,我想终止整个应用程序,我该怎么做?
谢谢。
qApp->exit()
在的构造函数中调用时this->close()
两者都不起作用。MainWindow
正常的 Qtint main()
函数如下所示:
int main(int argc, char *argv[])
{
QApplication application(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return application.exec();
}
...并且qApp->exit()
只能在qApp->exec()
/主循环内工作application.exec()
,正如您在 中看到的那样int main()
,您还没有在其中。因此它没有效果。
和this->close()
,MainWindow()
还没有完成创建,还没有显示,所以它没有打开 - 如果它没有打开,它就不能关闭。=)
我认为解决这个问题的最简单方法是将初始化延迟到构造函数完成之后:
int main(int argc, char *argv[])
{
QApplication application(argc, argv);
MainWindow mainWindow;
if(mainWindow.Initialize() == false)
return 0;
mainWindow.show();
return application.exec();
}
通常我更喜欢/建议在类的构造函数中进行初始化,但这里需要做一个例外来解决这种不寻常的情况。
做同样事情的其他方法是继续在构造函数中初始化,但使用一个标志来标记 MainWindow 已经“初始化失败”:
int main(int argc, char *argv[])
{
QApplication application(argc, argv);
MainWindow mainWindow; //Initialize in constructor, like normal.
if(mainWindow.Failed()) //Check results.
{
return 0;
}
mainWindow.show();
return application.exec();
}
异常也是处理这种情况的另一种方法 - 但请确保您抓住它,因此操作系统不会显示错误消息(如果 Windows 检测到我忘记了)。在您的初始化中,您自己报告错误,因此您可以详细报告它。
int main(int argc, char *argv[])
{
QApplication application(argc, argv);
try
{
MainWindow mainWindow; //Initialize in constructor, like normal.
mainWindow.show();
return application.exec();
}
catch(...)
{
return 0;
}
}
怎么样exit()
?
MainWindows::MainWindow(QWidget *parent) :
QMainWindow(parent) , ui(new Ui::MainWindow) {
ui->setupUi(this);
//some initialization code here
if (something_failed)
{
exit(1); // terminate process
}
}
这对我有用:
QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
您可以使用 assert 方法终止程序,该程序将自动检查条件,如果条件变为假,它将终止程序并给出它终止的行。语法如下:
Q_ASSERT(条件);
如果初始化失败,我想终止整个应用程序,我该怎么做?
从构造函数中抛出异常。默认情况下,未处理的异常将终止整个应用程序。你也可以调用QCoreApplication::quit - 但是最好还是抛出一个异常,在别处捕获它,如果事情真的出错了就使用 QCoreAPplication::quit。
如果您正在写入文件,简单地调用 exit 可能会导致数据丢失。