如何在退出Qt应用程序时做一些事情
How to do things upon quitting a Qt app
我的理解是,当所有相关的窗口关闭时,下面的代码将执行一个应用程序,该应用程序将退出。
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()));
我应该如何去清理(关闭硬件连接和库等),这样我就可以确保所有需要发生的事情都发生了,无论应用程序如何退出,也不是在执行的什么时候退出?
我将在整个应用程序中打开一个库,并在大多数时候连接到USB设备。如果进程运行正常,我可以很容易地关闭此连接,但如果有人决定在完成之前点击退出或关闭所有窗口,我希望安全关闭此连接。
QWidget有一个名为closeEvent
的虚函数(请参阅文档),当调用widget的close()
操作时调用该虚函数。
或者,如果您不想拥有自己的Base小部件,您可以将自己挂钩到信号QApplication::lastWindowClosed
(见这里)。当应用程序的最后一个可见窗口关闭时,它将被触发。
您可以这样做:
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;
}
正确的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
返回之前文件被关闭。
QThread
——它打破了这个期望,你必须实现一个包装器来修复它。
对于需要在堆上分配的资源,应该使用智能指针或QObject
内存管理。
您可以使用QApplication信号在应用程序退出之前进行清理:
QObject::connect(&app, SIGNAL(aboutToQuit()), &MyCleaner, SLOT(cleanUp()));
玩得开心!
相关文章:
- C++控制台应用程序阻止退出
- boost::asio::io_service 在线程中,不会在应用程序退出时退出
- 我在哪里编写在退出 C++ 窗口窗体应用程序之前执行的代码部分
- 正确退出 gtkmm 应用程序
- OpenGL 应用程序退出,退出代码为 -1073741515 (0xC0000135)
- 即使主窗口关闭,也不会退出应用程序
- 对 QMainWindow 使用 std::unique_ptr 时退出时出现 QT 应用程序分段错误
- 我如何使Ctrl Q退出一个没有Menubar的QT5应用程序
- C++11 监视器类,测试应用程序不想退出
- 由OpenCV 2.4.6创建的AVI文件在应用程序退出时并不总是有效
- 如何在应用程序退出时诊断comptr版本中的异常
- 我可以用wm_copydata模仿应用程序退出代码吗?
- boost::log add_file_log如果应用程序退出并CTRL_CLOSE_EVENT,则不会写入
- C++应用程序退出错误代码62097-这意味着什么
- 应用程序退出,然后在控制台中挂起
- 完成输出后,控制台应用程序退出.如何让它再次要求输入
- 应用程序退出时出现SegFault
- 应用程序退出时CEF崩溃(QT5+CEF3.2526)
- 进程仍处于应用程序退出状态
- 如何在MFC应用程序退出时设置错误级别