You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LinearRegionItem自定义右键菜单问题:屏蔽默认菜单与解决闪退

解决方案

问题1:阻止默认绘图菜单弹出

在重写的contextMenuEvent方法末尾调用event.accept(),明确告知Qt该事件已被处理,无需再触发父类或其他组件的默认右键菜单逻辑。

问题2:解决菜单弹出后立即消失

你创建的QMenu是局部变量,方法执行完毕后会被Python垃圾回收机制销毁,导致菜单瞬间消失。有两种可行的解决方式:

  • 方式一:使用exec_()替代popup(),exec_()是模态执行方式,会保持菜单存在直到用户完成操作(点击菜单项或空白区域关闭菜单)。
  • 方式二:将菜单定义为类的实例属性,避免方法结束后被销毁。

修改后的完整代码(方式一推荐)

class AnnotationItem(LinearRegionItem):
    def __init__(self, *args, **kwargs):
        super(AnnotationItem, self).__init__(*args, **kwargs, showSize=True)

    def contextMenuEvent(self, event):
        print('Method called...')
        cmenu = QtWidgets.QMenu()
        test1Act = cmenu.addAction("Test1")
        test2Act = cmenu.addAction("Test2")
        # 用exec_()替代popup(),避免局部变量被回收
        cmenu.exec_(event.screenPos())
        # 标记事件已处理,阻止默认菜单弹出
        event.accept()

实例属性实现方式(方式二)

class AnnotationItem(LinearRegionItem):
    def __init__(self, *args, **kwargs):
        super(AnnotationItem, self).__init__(*args, **kwargs, showSize=True)
        # 将菜单定义为实例属性
        self.cmenu = QtWidgets.QMenu()
        self.test1Act = self.cmenu.addAction("Test1")
        self.test2Act = self.cmenu.addAction("Test2")

    def contextMenuEvent(self, event):
        print('Method called...')
        self.cmenu.popup(event.screenPos())
        event.accept()

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:57:15