2018-10-24 18:02:09 +08:00
|
|
|
|
# 菜单设置多选并且不关闭
|
|
|
|
|
|
|
|
|
|
### [Python3.4.4 or Python3.5][PyQt5]
|
|
|
|
|
|
|
|
|
|
有时候会遇到这种需求:在界面某个位置弹出一个菜单,其中里面的菜单项可以多选(类似配置选项),
|
|
|
|
|
此时用QMenu会遇到点击一个菜单项就会自动关闭,当然可以通过其他方式实现该功能,
|
|
|
|
|
不过这里就采用QMenu通过特殊的方式来实现该需求。
|
|
|
|
|
|
2018-10-25 09:47:41 +08:00
|
|
|
|
需求:<br/>
|
2018-10-24 18:02:09 +08:00
|
|
|
|
菜单1<br/>
|
|
|
|
|
菜单2<br/>
|
|
|
|
|
菜单3<br/>
|
|
|
|
|
菜单4<br/>
|
|
|
|
|
|
|
|
|
|
点击菜单1、2、3可以多选不关闭菜单<br/>
|
|
|
|
|
点击菜单4可以勾选,并且关闭菜单
|
|
|
|
|
|
|
|
|
|
知识点:<br/>
|
|
|
|
|
1、设置菜单项可勾选:通过QAction.setCheckable(True)方法实现<br/>
|
2018-10-25 09:47:41 +08:00
|
|
|
|
2、设置菜单不可关闭:通过覆盖QMenu的鼠标释放mouseReleaseEvent方法(可直接替换或者通过installEventFilter安装事件过滤器实现)<br/>
|
|
|
|
|
3、在菜单的鼠标释放事件中,当点击菜单项后是通过点击点坐标来查找是否有QAction,然后触发对应的QAction。<br/>
|
2018-10-25 09:44:36 +08:00
|
|
|
|
4、故在没有QAction的地方则直接交还给QMenu自行处理逻辑,在有QAction的地方可以根据自己的需求进行处理(如上所提)
|
|
|
|
|
|
|
|
|
|
核心代码:<br/>
|
|
|
|
|
```python
|
|
|
|
|
def _menu_mouseReleaseEvent(self, event):
|
|
|
|
|
action = self._menu.actionAt(event.pos())
|
|
|
|
|
if not action:
|
|
|
|
|
# 没有找到action就交给QMenu自己处理
|
|
|
|
|
return QMenu.mouseReleaseEvent(self._menu, event)
|
|
|
|
|
if action.property('canHide'): # 如果有该属性则给菜单自己处理
|
|
|
|
|
return QMenu.mouseReleaseEvent(self._menu, event)
|
|
|
|
|
# 找到了QAction则只触发Action
|
|
|
|
|
action.activate(action.Trigger)
|
|
|
|
|
```
|
2018-10-24 18:02:09 +08:00
|
|
|
|
|
|
|
|
|
# 截图
|
|
|
|
|
![截图1](ScreenShot/1.gif)
|