MainWindows::MainWindow(QWidget *parent) :
QMainWindow(parent) , ui(new Ui::MainWindow) {
ui->setupUi(this);
some initialization code here
}
如果初始化失败,我希望能够终止整个应用程序,我该怎么做?
谢谢。
qApp->exit()
和this->close()
在MainWindow
的构造函数中调用时,都无法正常工作。
普通的Qt int 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();
}
通常我更喜欢/建议在类的构造函数中初始化,但是为了解决这种不寻常的情况,需要做出一个例外。
实现同样效果的其他方法是继续在构造函数中进行初始化,但使用一个标志来标记主窗口已经“初始化失败”:
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方法来终止程序,它会自动检查条件,如果条件变为false,则终止程序并给出终止的行。语法如下:
Q_ASSERT(condition);
quit()
时,通常不会产生任何效果,因为此时事件循环(QCoreApplication::exec()
)尚未运行。 - alexisdmqApp->exec()
之前创建,因此即使您捕获了异常,调用 qApp->quit()
仍然没有任何效果,您可以选择不调用 qApp->exec()
。 - alexisdm