如何在无父 QWidget 中接收 QMainWindow mouseClick 事件?

Posted

技术标签:

【中文标题】如何在无父 QWidget 中接收 QMainWindow mouseClick 事件?【英文标题】:How to receive QMainWindow mouseClick events in a parentless QWidget? 【发布时间】:2020-05-13 13:43:31 【问题描述】:

我有一个生成多个 QWidget 弹出窗口的 QMainWindow 应用程序。如果用户单击主 QMainWindow,我想知道如何销毁弹出的 QWidgets。我不确定如何继续解决此问题。我不想干扰任何 QMainWindow 事件,我只想通过在弹出窗口小部件区域之外的任何鼠标单击来破坏额外的弹出窗口。通过信号槽机制或事件过滤器是否可能或推荐?不处理(x,y)坐标可以吗?

感谢您的建议。

【问题讨论】:

这些小部件是否仍应提供鼠标交互? minimal, reproducible example 会有所帮助,尤其是了解这些小部件是如何创建的以及它们的窗口标志(如果设置了的话)。 @musicamante 不,窗户应该被完全摧毁。我将尝试解开并发布一个示例。弹出窗口是无框的,并停留在顶部窗口上。 【参考方案1】:

我设法解决了我的问题。我实现了一个包含mousePressedEvent 的自定义标签(如this)。单击此标签会生成一个 Pop 小部件。 mousePressEvent 不会从标签进一步传播。然后我在 QMainWindow 中实现了一个 mousePressedEvent,我在其中检查是否存在弹出窗口。如果它们存在,我将它们全部关闭。请注意,如果我没有在标签 mousePressEvent 中停止鼠标传播,则在单击标签时会生成弹出窗口,但它会立即被 QMainWindow mousePressEvent 关闭,因为(很可能)该事件正在传播到 QMainWindow。至少,这解决了我的问题。

谢谢

【讨论】:

虽然您的解决方案可能对 您的 问题有所帮助,但您的回答对 *** 并没有太大帮助,因为您没有为您的两个问题提供 minimal, reproducible examples你的答案。我想我可以理解您所描述的内容,但是可能遇到类似问题的经验较少的用户可能不会,并且提供 MRE 确实有助于整个社区。我不会拒绝您的回答(恐怕我应该),但我建议对其进行编辑并提供实际代码以更好地解释您是如何实现您所做的。

以上是关于如何在无父 QWidget 中接收 QMainWindow mouseClick 事件?的主要内容,如果未能解决你的问题,请参考以下文章

忽略 QWidget 点击事件并将其传播到操作系统

每当将 QWidget 添加到 QApplication 的小部件树时,如何接收事件?

如何在没有任务栏条目的情况下获得无父 QWindow

是否隐藏 QWidget 对象接收信号

QWidget 键盘事件 焦点(QApplication源码)

如何将消息从 QWidget 发送到 QStatusBar?