Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 完全删除QApplication实例并在另一个线程中重新创建它_C++_Qt_Exit_Qapplication - Fatal编程技术网

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

C++ 完全删除QApplication实例并在另一个线程中重新创建它,c++,qt,exit,qapplication,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.exec()之后关闭应用程序) 我已尝试做以下工作: app->

如何完全删除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实例。 如果我没有在main中定义QApplication,则共享库中的QApplication始终有效

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

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

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

    据我所知,你不能
    QApplication
    使用
    静态
    或全局变量,直到程序退出为止。据我所知,您不能
    QApplication
    使用
    静态
    或全局变量,直到程序退出。我要做的是执行一个对话框,做一些事情,然后关闭它。然后使用库中的另一个对话框(已经创建了QApplication对象和app.exec)。如果关闭第一个对话框,事件循环将被保留。那么,是否可以保留事件循环,以便从库中删除创建QApplication和exec?或者,如果有一种方法可以在关闭对话框后使用库中的QApplication从主应用程序中删除QApplication对象?正如我所说,如果不在主应用程序中使用QApplication,库中的QApplication对象将正确初始化。Kuba:关于保持事件循环,你肯定是对的。但是,我无法启动新对话框。我可以使用QApplication实例单独启动每个应用程序,但我不能使用同一个实例,也不能重新创建新实例。我需要完全关闭第一个对话框,然后打开另一个(不应该在一起,一次只能打开一个)。如果我在初始化另一个实例之前从内存中完全删除第一个实例,或者你有其他方法来完成它,那就太好了。请编辑问题以回答以下问题:1。库(lib)和主应用程序(app)是否使用相同的Qt副本?2.你是应用程序和库的开发者吗?3.什么触发了第二个对话框的显示?4.显示一个模拟应用程序和库,演示您正在尝试做什么。我们讨论的是总共40行代码,可能跨越两个
    .cpp
    文件。我要做的是执行一个对话框,做一些事情,然后关闭它。然后使用库中的另一个对话框(已经创建了QApplication对象和app.exec)。如果关闭第一个对话框,事件循环将被保留。那么,是否可以保留事件循环,以便从库中删除创建QApplication和exec?或者,如果有一种方法可以在关闭对话框后使用库中的QApplication从主应用程序中删除QApplication对象?正如我所说,如果不在主应用程序中使用QApplication,库中的QApplication对象将正确初始化。Kuba:关于保持事件循环,你肯定是对的。但是,我无法启动新对话框。我可以使用QApplication实例单独启动每个应用程序