退出Qt应用程序时如何做事

时间:2014-07-21 11:33:07

标签: c++ qt dll usb qt-creator

据我了解,以下内容将执行一个应用程序,该应用程序将在关闭所有关联窗口时退出。

int main(int argc, char *argv[])
{
    QApplication cal(argc, argv); //Application instance

    MainWindow window; //Create window in the stack
    window.show(); //Show the window

    return cal.exec(); //Execute event loop
}

这也将退出申请。

quitButton = new QPushButton("Quit", this);

connect(quitButton, SIGNAL(clicked()), QApplication::instance(), SLOT(quit()));

我应该如何清理(关闭硬件连接和库等),以便我可以确定无论应用程序退出的方式如何,以及退出的执行时间点都会发生所有需要发生的事情?< / p>

我将在整个应用程序中打开一个库,并且大多数时候都会连接到USB设备。如果进程正在运行,我可以轻松地关闭此连接,但是如果某人决定在完成之前决定退出或关闭所有窗口,我希望安全地关闭连接。

4 个答案:

答案 0 :(得分:2)

QWidget有一个名为closeEvent的虚函数(请参阅Documentation,在调用小部件close()操作时调用该函数。

或者,如果您不想拥有自己的基本窗口小部件,则可以将自己挂钩到信号QApplication::lastWindowClosed(请参阅here)。当应用程序的最后一个可见窗口关闭时会发出它。

答案 1 :(得分:1)

您可以执行以下操作:

int main(int argc, char *argv[])
{
    QApplication cal(argc, argv);

    // Allocate resources

    int ret = cal.exec(); // start the event loop and wait until it quits

    // Free the resources

    return ret;
}

答案 2 :(得分:1)

正确的C ++方式是:

  1. 确保所有对象实例都被破坏。

  2. 确保您持有的所有资源都通过RAII保留。

  3. 然后你不需要做任何特别的事情。当main返回时对象被破坏,事情就会被清除。

    例如:

    int main(int argc, char ** argv) {
      QApplication app(argc, argv);
      QObject foo;
      QObject * bar = new QObject(&app);
      Widget w;
      w.show();
      return app.exec();
    }
    

    此处foobar都会在main返回之前被正确销毁。现在假设你持有一些非内存资源,比如文件:

    class Worker : public QObject {
      QFile m_file;
      ...
      void doSomething() {
        if (m_file.open()) {
          ...
        }
        // No file closing!
      }
    };
    
    int main(int argc, char ** argv) {
      QApplication app(argc, argv);
      Worker foo;
      Widget w;
      w.show();
      return app.exec();
    }
    

    同样,文件在main返回之前关闭。

    简而言之,这就是RAII的工作方式。如果你有自己的包装操作系统或其他资源的类,只需确保在类被破坏时释放这些资源 - 并且类总是可以破坏(破坏它们总是安全的)。我的烦恼是QThread - 它打破了这种期望,你必须implement a wrapper才能修复它。

    对于需要在堆上分配的资源,您应该使用智能指针或QObject内存管理。

答案 3 :(得分:0)

在应用程序退出之前,您可以使用QApplication信号进行清理:

QObject::connect(&app, SIGNAL(aboutToQuit()), &MyCleaner, SLOT(cleanUp()));

玩得开心!