PySide6 GUI 编程(33):重载右键上下文菜单 contextMenuEvent

2024-08-23 20:33:52 浏览数 (3)

示例代码

代码语言:python代码运行次数:0复制
from __future__ import annotations

import sys
from datetime import datetime

from PySide6.QtGui import QAction, QContextMenuEvent
from PySide6.QtWidgets import QApplication, QMainWindow, QMenu


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("ContextMenu Demo")
        self.action_button_1 = QAction("按钮1", self)
        self.action_button_2 = QAction("按钮2", self)
        self.action_button_1.triggered.connect(self.action_button_triggered)
        self.action_button_2.triggered.connect(self.action_button_triggered)

    def contextMenuEvent(self, event: QContextMenuEvent):
        """
        QMainWindow 的 contextMenuEvent(QContextMenuEvent *) 是一个事件处理器
        它在用户请求上下文菜单时被触发
        默认情况下,这通常发生在用户右键点击窗口的非客户区域(non-client area)时例如标题栏、边框或状态栏
        在某些操作系统或窗口管理器中,也可能在点击特定的客户区域(client area)时触发,这取决于系统的行为和用户的设置
        contextMenuEvent 事件处理器接收一个 QContextMenuEvent 对象作为参数
        该对象包含了触发上下文菜单事件的相关信息,例如位置和原因
        """
        context = QMenu()
        context.addAction(self.action_button_1)
        context.addAction(self.action_button_2)
        context.exec(event.globalPos())
        print(f'坐标:{event.globalPos().toTuple()},'
              f'设备名称:{event.device().name()},'
              f'设备类型:{event.deviceType()},'
              f'事件类型:{event.type()},'
              f'事件来源:{event.reason()}')

    def action_button_triggered(self):
        action_button = self.sender()
        if action_button:
            print(action_button.text(), datetime.now().isoformat())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    sys.exit(app.exec())

运行效果

右键菜单右键菜单

0 人点赞