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



如何完全删除 QApplication 实例,以便可以在剪切库中再次重新创建它。 如果我有这样的代码:

int main(int argc, char ** argv) {
QApplication *app = new QApplication(argc, argv);
MyWindow dialog;
dialog.show();
app->exec();
return 0
}

我希望能够在退出应用程序后删除实例(在 app.exec() 之后关闭应用程序) 我尝试执行以下操作:

app->setQuitOnLastWindowClosed(false);
app->quit();
delete app;

但是他们都不能工作。我想删除 QApplication 实例,就像我以前没有创建的那样。 如果我没有在主库中定义 QApplication,我的共享库中的 QApplication 总是有效的。

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

你不需要这样做,因为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);

相关内容

  • 没有找到相关文章

最新更新