无论小部件结构如何,如何确保按钮关闭应用程序?
Posted
技术标签:
【中文标题】无论小部件结构如何,如何确保按钮关闭应用程序?【英文标题】:How to ensure button closes the application regardless of the widget structure? 【发布时间】:2015-12-17 15:26:26 【问题描述】:如果您有一个简单的QMainWindow
甚至是一个带有单个QWidget
的应用程序,您可以将任何按钮连接到其上的close()
插槽,它将关闭程序。您甚至可以在设计器中执行此操作而无需任何编码:
但是,一旦您拥有更复杂的结构,其中MainMenu
是另一个小部件的子级,这将停止工作。在这种情况下,close
插槽仅隐藏MainMenu
(因此您只会看到黑屏),但应用程序会继续运行。我想知道是否有非 hacky 方式来终止程序,而不管小部件层次结构如何。
调用abort
或类似方法被认为是hacky。总有一些清理工作必须进行。
【问题讨论】:
【参考方案1】:只需将您的QPushButton::clicked()
信号连接到QCoreApplication::quit() 插槽。这将在单击按钮时永久关闭应用程序。
注意:QCoreApplication
可以通过qApp
全局对象访问。
connect( myButton, SIGNAL(clicked()), qApp, SLOT(quit()) );
你在 OP 中提到:
您可以将任何按钮连接到其上的 close() 插槽,它将关闭程序
请注意,这不一定是真的。只有当QGuiApplication::quitOnLastWindowClosed() 是true
时才成立(这是默认值,我必须承认)。
【讨论】:
【参考方案2】:大概:
使用 Qt 父\子模型 需要停止应用时调用静态方法QCoreApplication::exit
。它在主(GUI)线程上调用QEventLoop::exit
。它会触发***对象及其子对象的销毁
(可选)如果您启动工作线程,请使用 movetoThread design 执行此操作。那么QThread对象的拥有者只需要做以下事情:
QThread workthread;
workthread.exit(code);
workthread.wait(time_ms);
if(workthread.isRunning())
workthread.terminate();
通常你不想使用终止。
【讨论】:
我不明白线程部分。我没有手动启动任何线程 - 也许我不需要那部分?QEventLoop::exit
是静态的吗?如果没有,我如何从我的 ui 类访问它?我可能需要从 click 事件处理程序中调用它。
如果您不启动线程,则不需要该部分。已编辑以上是关于无论小部件结构如何,如何确保按钮关闭应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?
如何使用flutter和kotlin在应用程序之外拥有小部件?
单击时如何将按钮值从自定义小部件传递到 tkinter 中的主应用程序