我正在尝试使用
QCheckBox
小部件显示布尔变量的值,并使用户无法更改显示的值。我不想禁用它,因为由此产生的灰色看起来不太好。我尝试通过当用户单击 QCheckBox
时将新值更改回之前的值来近似效果。然而,小部件的状态是由 QAbstractButton
父类的“checked”属性和 QCheckBox
类本身的“state”属性描述的,这一事实使问题变得更加复杂。这产生了信号和时隙的组合练习,但我无法获得任何好的结果。
var_ctrl = QtGui.QCheckBox( 'some name' )
def rdslot1(state):
if state == QtCore.Qt.Checked:
var_ctrl.setCheckState( QtCore.Qt.Unchecked )
else:
var_ctrl.setCheckState( QtCore.Qt.Checked )
def rdslot2(state):
if var_ctrl.isChecked():
var_ctrl.setChecked(False)
else:
var_ctrl.setChecked(True)
# Signal/Slot combinations (only one should be active)
var_ctrl.stateChanged.connect( rdslot1 )
var_ctrl.toggled.connect( rdslot2 )
var_ctrl.stateChanged.connect( rdslot2 )
var_ctrl.toggled.connect( rdslot1 )
我参加聚会迟到了 - 看来您找到了有效的解决方案。为了将来的参考,您可以做到的另一种方法是使用鼠标事件 - 这使您的所有信号都按应有的方式工作:
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 小部件时非常有用:
后来我想出了一个快捷方式,它可以简单地捕获用户的点击并根据可指定的“可修改”属性来处理它们。我上过这门课:
class MyQCheckBox(QtGui.QCheckBox):
def __init__(self, *args, **kwargs):
QtGui.QCheckBox.__init__(self, *args, **kwargs)
self.is_modifiable = True
self.clicked.connect( self.value_change_slot )
def value_change_slot(self):
if self.isChecked():
self.setChecked(self.is_modifiable)
else:
self.setChecked(not self.is_modifiable)
def setModifiable(self, flag):
self.is_modifiable = flag
def isModifiable(self):
return self.is_modifiable
它的行为就像普通的
QCheckBox
一样,默认情况下是可以修改的。但是,当您调用 setModifiable(False)
时,每次单击它时,它都会保留小部件的当前状态。诀窍是捕获 clicked
信号,而不是 toggled
或 stateChanged
。
根据条件在 QCheckBox 之上创建另一个 QLable,它将停止其下的复选框以在未选中时进行选中。