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

How to ensure button closes the application regardless of the widget structure?

如果您有一个简单的 QMainWindow 或什至只有一个 QWidget 的应用程序,您可以将任何按钮连接到它上面的 close() 插槽,它会关闭程序。您甚至可以在设计器中执行此操作而无需任何编码:

但是,一旦您拥有更复杂的结构,其中 MainMenu 是另一个小部件的子项,这将停止工作。在这种情况下,close 插槽只会隐藏 MainMenu(因此您只会看到黑屏),但应用程序会保留 运行。我想知道是否有非 hacky 的方式来终止程序而不考虑小部件层次结构。

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

大致:

  • 使用 Qt parent\children 模型
  • 在需要停止应用程序时调用静态方法QCoreApplication::exit。它在主 (GUI) 线程上调用 QEventLoop::exit。它会触发顶级对象及其子对象的销毁
  • 可选,如果您启动工作线程,请使用 movetoThread design 执行。那么QThread对象的拥有者只需要做如下的事情:

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

通常您不想使用终止。

只需将您的 QPushButton::clicked() 信号连接到 QCoreApplication::quit() 插槽。这将在单击按钮时永久关闭应用程序。

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

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

您在 OP 中提到:

you can connect any button to close() slot on it and it will close the program

请注意,这不一定是真的。仅当 QGuiApplication::quitOnLastWindowClosed()true(这是默认设置,我必须承认)时才为真。