113 Star 947 Fork 337

PyQt5/PyQt

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

QMenu

1、菜单设置多选并且不关闭

运行 MultiSelect.py

有时候会遇到这种需求:在界面某个位置弹出一个菜单,其中里面的菜单项可以多选(类似配置选项), 此时用QMenu会遇到点击一个菜单项就会自动关闭,当然可以通过其他方式实现该功能, 不过这里就采用QMenu通过特殊的方式来实现该需求。

需求:显示4个菜单(菜单1、菜单2、菜单3、菜单4), 其中点击菜单1、2、3可以多选不关闭菜单, 点击菜单4可以勾选,并且关闭菜单

原理:

  1. 设置菜单项可勾选:通过QAction.setCheckable(True)方法实现
  2. 设置菜单不可关闭:通过覆盖QMenu的鼠标释放mouseReleaseEvent方法(可直接替换或者通过installEventFilter安装事件过滤器实现)
  3. 在菜单的鼠标释放事件中,当点击菜单项后是通过点击点坐标来查找是否有QAction,然后触发对应的QAction
  4. 故在没有QAction的地方则直接交还给QMenu自行处理逻辑,在有QAction的地方可以根据自己的需求进行处理(如上所提)

核心代码:

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)

MultiSelect

2、仿QQ右键菜单

运行 QQMenu.py

QQMenu

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/PyQt5/PyQt.git
git@gitee.com:PyQt5/PyQt.git
PyQt5
PyQt
PyQt
master

搜索帮助

371d5123 14472233 46e8bd33 14472233