无论小部件结构如何,如何确保按钮关闭应用程序?

时间:2015-12-17 15:26:26

标签: android c++ qt qt-designer

如果你有一个简单的QMainWindow甚至是单QWidget的应用,你可以将任意按钮连接到它上面的close()插槽,它将关闭该程序。您甚至可以在没有任何编码的情况下在设计师中执行此操作:

image description

但是,如果你有一个更复杂的结构,MainMenu是另一个小部件的子节点,这将停止工作。在这种情况下,close插槽仅隐藏MainMenu(因此您只看到黑屏),但应用程序仍在运行。我想知道是否有非hacky方式终止程序而不管小部件层次结构。

调用abort或类似方法被认为是hacky。总而言之,必须进行一些清理工作。

2 个答案:

答案 0 :(得分:1)

只需将QPushButton::clicked()信号连接到QCoreApplication::quit()广告位即可。这将在单击按钮时关闭应用程序。

注意:QCoreApplication可以通过qApp全局对象访问。

connect( myButton, SIGNAL(clicked()), qApp, SLOT(quit()) );

你在OP中提到过:

  

您可以将任何按钮连接到其上的关闭()插槽,它将关闭程序

请注意,这不一定是真的。只有QGuiApplication::quitOnLastWindowClosed()true时才会出现这种情况(默认情况下,我必须承认)。

答案 1 :(得分:0)

大致是:

  • 使用Qt parent \ children model
  • 在需要停止应用程序时调用静态方法QCoreApplication::exit。它在主(GUI)线程上调用QEventLoop::exit。它会触发顶级对象及其子级的破坏
  • 或者,如果您启动工作线程,请使用movetoThread design执行此操作。然后QThread对象的所有者只需要执行以下操作:

    QThread workthread;
    workthread.exit(code);
    workthread.wait(time_ms);
    if(workthread.isRunning())
    {
       workthread.terminate();
    }
    

一般情况下,您不想使用终止。