如果初始化失败,如何终止qt编程?

Jic*_*hao 4 c++ qt

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)


kar*_*lip 5

怎么样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)