当法线QCheckbox
处于PartiallyChecked
状态时,您左键单击它,它将更改为Checked
状态。右键单击复选框不会执行任何操作。
我想修改一个复选框,以便右键单击与左键单击的效果相同,除非在PartiallyChecked
状态下单击时状态将更改为Unchecked
而不是Checked
。
这是我实现这一目标的尝试:
class MyCheckBox(QCheckBox):
def __init__(self):
super().__init__()
self.clicked.connect(lambda: self.setTristate(False))
def mousePressEvent(self, event: QMouseEvent):
if event.button() == Qt.MouseButton.RightButton:
event = QMouseEvent(event.type(), event.position(), Qt.MouseButton.LeftButton, event.buttons(), event.modifiers())
super().mousePressEvent(event)
def mouseReleaseEvent(self, event: QMouseEvent):
if event.button() == Qt.MouseButton.RightButton:
event = QMouseEvent(event.type(), event.position(), Qt.MouseButton.LeftButton, event.buttons(), event.modifiers())
if self.checkState() == Qt.CheckState.PartiallyChecked:
self.setCheckState(Qt.CheckState.Checked)
super().mouseReleaseEvent(event)
这将按预期工作,除非您按下复选框 > 在按住按钮的同时移开复选框 > 释放按钮。的自定义部分mouseReleaseEvent
正在执行,而“本机”部分(在 super() 调用中)则没有执行。例如,clicked
不发出信号。
您将如何做到这一点,以便发布事件的自定义部分以与本机部分相同的方式执行,即不在发布事件关闭复选框时执行。
可能相关的观察结果:
当您按下复选框时,该框会变成阴影。当您离开盒子(按住)时,阴影就会消失,并且当再次在盒子上移动时,阴影会再次出现。
此行为不会复制到我的右侧按钮的自定义复选框中。离开盒子时,阴影将保留。
为了在鼠标移动时也提供正确的行为,您
mouseMoveEvent()
也必须覆盖,但在这种情况下,不同的按钮必须是事件的一部分buttons()
(注意复数)。最好让按钮处理状态更改并最终在
nextCheckState()
. 使用简单的内部布尔属性,您可以相应地设置不同的状态。