我迟到了 – 看起来你有一个有效的解决方案.为了将来参考,您可以采用的另一种方式是使用鼠标事件 – 这可以保持所有信号的工作方式:
from PyQt4 import QtGui, QtCore
class MyCheckBox(QtGui.QCheckBox):
def __init__( self, *args ):
super(MyCheckBox, self).__init__(*args) # will fail if passing **kwargs
self._readOnly = False
def isReadOnly( self ):
return self._readOnly
def mousePressEvent( self, event ):
if ( self.isReadOnly() ):
event.accept()
else:
super(MyCheckBox, self).mousePressEvent(event)
def mouseMoveEvent( self, event ):
if ( self.isReadOnly() ):
event.accept()
else:
super(MyCheckBox, self).mouseMoveEvent(event)
def mouseReleaseEvent( self, event ):
if ( self.isReadOnly() ):
event.accept()
else:
super(MyCheckBox, self).mouseReleaseEvent(event)
# Handle event in which the widget has focus and the spacebar is pressed.
def keyPressEvent( self, event ):
if ( self.isReadOnly() ):
event.accept()
else:
super(MyCheckBox, self).keyPressEvent(event)
@QtCore.pyqtSlot(bool)
def setReadOnly( self, state ):
self._readOnly = state
readOnly = QtCore.pyqtProperty(bool, isReadOnly, setReadOnly)
以这种方式设置代码可以为您提供一些(您可能或可能不关心)但在开发自定义Qt小部件时非常有用:
>消耗事件会阻止信号发射,因此您仍然可以将其他插槽连接到clicked&切换.如果你正在寻找这些信号然后只是打开/关闭值 – 那么听取这些信号的其他小部件将被错误地触发>使用isReadOnly / setReadOnly使类遵循Qt编码样式>创建pyqtSignals&如果将插件公开给Qt的Designer,pyqtSlots会有所帮助