113 Star 951 Fork 342

PyQt5/PyQt

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
.github
Demo
Donate
PyQtGraph
QAxWidget
QCalendarWidget
QCheckBox
QColumnView
QComboBox
QDateTime
QDateTimeEdit
QDial
QDockWidget
QDoubleSpinBox
QFileSystemModel
QFlowLayout
QFont
QFontComboBox
QFormLayout
QFrame
QGraphicsDropShadowEffect
QGraphicsView
QGridLayout
QGroupBox
QHBoxLayout
QLCDNumber
QLabel
QLineEdit
QListView
QListWidget
QMdiArea
QMenu
ScreenShot
MultiSelect.py
QQMenu.py
README.en.md
README.md
QMessageBox
QMetaObject
QOpenGLWidget
QPainter
QPlainTextEdit
QProcess
QProgressBar
QPropertyAnimation
QProxyStyle
QPushButton
QRadioButton
QScrollArea
QScrollBar
QSerialPort
QSlider
QSpacerItem
QSpinBox
QSplashScreen
QSplitter
QStackedLayout
QStackedWidget
QSystemTrayIcon
QTabWidget
QTableView
QTableWidget
QTextBrowser
QTextEdit
QThread
QTimeEdit
QToolBox
QToolButton
QTreeView
QTreeWidget
QVBoxLayout
QWebChannel
QWebEngineView
QWebView
QWidget
QtChart
QtDataVisualization
QtQuick
QtRemoteObjects
QtWinExtras
Test
.gitattributes
.gitignore
LICENSE
README.md
克隆/下载
贡献代码
同步代码
取消
提示: 由于 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

搜索帮助