完全删除QApplication Instance并在另一个线程中重新创建它

时间:2017-03-30 07:54:27

标签: c++ qt exit qapplication

如何完全删除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总是有效。

  1. 库(lib)和主应用程序(app)正在使用Qt的不同副本。
  2. 我正在开发应用程序,lib已导入我的应用程序。
  3. 关闭第一个对话框后,我正在使用一个事件触发库中正在等待此事件的线程。

1 个答案:

答案 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);