1

我怎样才能完全删除 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. 关闭第一个对话框后,我正在使用一个事件来触发它正在等待此事件的库中的线程。
4

1 回答 1

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);
于 2017-03-30T13:16:22.170 回答