无论小部件结构如何,如何确保按钮关闭应用程序?
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
(这是默认设置,我必须承认)时才为真。
如果您有一个简单的 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
(这是默认设置,我必须承认)时才为真。