如何完全删除QApplication实例,以便可以在剪切的库中重新创建它。 如果我有以下代码:
int main(int argc, char ** argv) {
QApplication *app = new QApplication(argc, argv);
MyWindow dialog;
dialog.show();
app->exec();
return 0
}
我希望能够在退出app后删除实例(在app.exec()之后关闭应用程序) 我试图做以下事情:
app->setQuitOnLastWindowClosed(false);
app->quit();
delete app;
但不是他们可以工作。我想删除之前没有创建的QApplication实例。 如果我没有在main中定义QApplication,那么共享库中的QApplication总是有效。
答案 0 :(得分:0)
您不需要这样做,因为QApplication
只能在主线程中创建。如果库和主可执行文件共享相同的Qt库,可能主应用程序已经创建了QApplication对象,并将为您运行事件循环。因此,您在库中唯一需要做的就是创建一些对象,事件循环将处理它们的事件。
如果主可执行文件不使用Qt,那么你应该在主线程中创建应用程序,启动它的事件循环,并让本机事件循环为你调度事件。
唉,直接回答你的问题:大概是你想在app.exec()
返回后做一些事情。您的代码可能就是:
int main(int argc, char ** argv) {
{
QApplication app{argc, argv};
MyWindow dialog;
dialog.show();
app.exec();
}
doSomething();
}
如果我关闭第一个对话框,则会保留事件循环。是否可以保持事件循环?
是。您可以清除第一个对话框的Qt::WA_QuitOnClose
属性。或者,最好在对话框中设置它 - 只要有QT::WA_QuitOnClose
的任何对话框仍然打开,应用程序就不会退出。
因此,对于第二个对话框,请调用:
secondDialog->setAttribute(Qt::WA_QuitOnClose);
或者,如果您没有指向对话框的指针,则可以迭代所有顶级窗口小部件并清除(或设置)所有这些属性:
for (auto widget : qApp->topLevelWidgets())
widget->setAttribute(Qt::QA_QuitOnClose, false);