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

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 中的主应用程序

如何将值从主屏幕小部件传递给应用程序?

当我在颤动中按下按钮时,如何将 Card 小部件替换为 TextField? [关闭]

仅当我在主应用程序中按下活动中的按钮时,如何更新小部件