请问,两个QWidget重合,被盖的QWidget有个右键菜单,盖在上面的QWidget设置了鼠标事件穿透,当在QWiget上右键弹出菜单后,点击非菜单区域时,被盖的那个QWidget却显示出来,应该怎么处理
时间: 2024-03-02 13:49:50 浏览: 58
这是因为被盖的QWidget设置了鼠标事件穿透,当你弹出右键菜单后,鼠标焦点会被菜单所占用,从而导致被盖的QWidget无法接收到鼠标事件。当你点击非菜单区域时,菜单消失,鼠标焦点回到了被盖的QWidget上,从而导致该QWidget显示出来。
要解决这个问题,你可以在弹出右键菜单时,临时禁用被盖的QWidget的鼠标事件穿透功能。具体做法如下:
1. 在被盖的QWidget中,添加一个函数用于开启和关闭鼠标事件穿透功能:
```python
def setPassThroughEnabled(self, enabled):
self.setAttribute(Qt.WA_TransparentForMouseEvents, enabled)
```
2. 在右键菜单中,临时禁用被盖的QWidget的鼠标事件穿透功能:
```python
def contextMenuEvent(self, event):
# 在弹出右键菜单时,禁用被盖的QWidget的鼠标事件穿透功能
self.covered_widget.setPassThroughEnabled(False)
menu = QMenu(self)
# ... 添加菜单项 ...
# 在菜单关闭时,重新启用被盖的QWidget的鼠标事件穿透功能
menu.aboutToHide.connect(lambda: self.covered_widget.setPassThroughEnabled(True))
menu.exec_(event.globalPos())
```
这样,在弹出右键菜单时,被盖的QWidget就不会接收到鼠标事件,从而不会显示出来了。在菜单关闭时,再重新启用被盖的QWidget的鼠标事件穿透功能,以便后续能够正常地接收鼠标事件。
阅读全文