Python 重写Qt MouseeEvent,但仅当类变量为True时

Python 重写Qt MouseeEvent,但仅当类变量为True时,python,pyqt,pyqt5,pyside2,Python,Pyqt,Pyqt5,Pyside2,我有QComboBox,我希望用户能够锁定的索引。为此,我将QComboBox子类化,并将mousePressEvent重写为空,但在QComboBox的方法中 我尝试的两个问题: 我不知道如何在另一个类方法中重新定义mousePressEvent 如果不满足某个条件,我不知道如何恢复QComboBox的原始mousePressEvent行为。我的代码: 类MyComboBox(qtwidts.QComboBox): 定义初始化(self,*args,**kwargs): 超级(self.\

我有
QComboBox
,我希望用户能够锁定的索引。为此,我将
QComboBox
子类化,并将
mousePressEvent
重写为空,但在
QComboBox
的方法中

我尝试的两个问题:

  • 我不知道如何在另一个类方法中重新定义
    mousePressEvent
  • 如果不满足某个条件,我不知道如何恢复
    QComboBox
    的原始
    mousePressEvent
    行为。我的代码:
类MyComboBox(qtwidts.QComboBox):
定义初始化(self,*args,**kwargs):
超级(self.\uuuuuuu类,self.\uuuuu初始值(*args,**kwargs)
def锁定选择(自身,布尔=无):
如果布尔:
def鼠标压力(自我,*args,**kwargs):
通过
其他:
def鼠标压力(自我,*args,**kwargs):
返回qtwidts.QComboBox.mousePressEvent(*args,**kwargs)
..... 后来
##我想用这个来获取我的鼠标压力
MyComboBox.lockSelection(真)
##我想把这个拿到原来的mousePressEvent
MyComboBox.lockSelection(假)

如果要阻止继承的方法,只需重写该方法,并在必要时避免调用该方法:

从PyQt5导入QtWidgets
类MyComboBox(qtwidts.QComboBox):
def锁定选择(自锁定):
自我锁定选择=锁定
def鼠标压力事件(自身、事件):
lock=getattr(self,“\u lock\u selection”,False)
如果未锁定:
超级(MyComboBox,self).鼠标压力事件(event)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=qtwidts.QWidget()
combo=MyComboBox()
组合添加项(列表(“ABCD”))
radio=qtwidts.QCheckBox(“锁”)
收音机。切换。连接(组合。锁定选择)
lay=qtwidts.QHBoxLayout(w)
lay.addWidget(收音机)
lay.addWidget(组合)
w、 调整大小(320,60)
w、 show()
sys.exit(app.exec_())
如果要避免继承,可以使用事件过滤器实现锁定器,以便在任何小部件中使用它:

从PyQt5导入QtCore、QtWidgets
类鼠标器(QtCore.QObject):
定义初始化(自我,小部件):
超级(鼠标器,自我)。\uuuu初始化(小部件)
widget.installEventFilter(自身)
self.\u lock\u selection=False
def锁定选择(自锁定):
自我锁定选择=锁定
def事件过滤器(自身、obj、事件):
如果obj是self.parent()且event.type()==QtCore.QEvent.MouseButtonPress:
返回自我。\u锁定\u选择
return super(MouseLocker,self).eventFilter(obj,event)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=qtwidts.QWidget()
combo=qtwidts.QComboBox()
组合添加项(列表(“ABCD”))
锁定器=鼠标器(组合)
radio=qtwidts.QCheckBox(“锁”)
收音机。切换。连接(锁柜。锁选择)
lay=qtwidts.QHBoxLayout(w)
lay.addWidget(收音机)
lay.addWidget(组合)
w、 调整大小(320,60)
w、 show()
sys.exit(app.exec_())

第一个对我来说很有魅力!我也尝试过使用事件过滤器方法,但由于某种原因,当鼠标离开UI窗口时,ComboBox小部件消失了。有点奇怪。