据我了解,以下内容将执行一个应用程序,该应用程序将在关闭所有关联窗口时退出。
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设备。如果进程正在运行,我可以轻松地关闭此连接,但是如果某人决定在完成之前决定退出或关闭所有窗口,我希望安全地关闭连接。
答案 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 ++方式是:
确保所有对象实例都被破坏。
确保您持有的所有资源都通过RAII保留。
然后你不需要做任何特别的事情。当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();
}
此处foo
和bar
都会在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()));
玩得开心!