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
相关产品推荐
相关产品推荐

