MainWindows::MainWindow(QWidget *parent) :
QMainWindow(parent) , ui(new Ui::MainWindow) {
ui->setupUi(this);
some initialization code here
}
Run Code Online (Sandbox Code Playgroud)
如果初始化失败,我想终止整个应用程序,我怎么能这样做?
谢谢.
Jam*_*rey 11
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();
}
Run Code Online (Sandbox Code Playgroud)
...并且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();
}
Run Code Online (Sandbox Code Playgroud)
通常我更喜欢/建议在类的构造函数中初始化,但是这里需要做出异常来解决这种不寻常的情况.
执行相同操作的其他方法是继续在构造函数中初始化,但使用标志来标记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();
}
Run Code Online (Sandbox Code Playgroud)
异常也是处理这种情况的另一种方法 - 但请确保捕获它,因此操作系统不会显示任何错误消息(如果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;
}
}
Run Code Online (Sandbox Code Playgroud)
怎么样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
}
}
Run Code Online (Sandbox Code Playgroud)