我怎样才能在不触发事件的情况下禁用QCheckBox?

2 人关注

我想知道是否有办法在pyqt中禁用(setCheckState)一个复选框(QCheckBox)而不触发一个事件?所以它只是一个简单的显示变化,复选框现在没有被选中,但不会触发我所连接的方法。谢谢你的帮助。

如果可能的话,希望有一个基本的例子。

python
pyqt
qcheckbox
Nick van Diem
Nick van Diem
发布于 2015-06-05
2 个回答
mguijarr
mguijarr
发布于 2020-01-15
已采纳
0 人赞同

你可以在禁用QCheckBox之前简单地屏蔽信号,然后在禁用之后重新启用。 之后再重新启用它们。假设 chk 是你的QCheckBox 对象,就这样做。

chk.blockSignals()
# then you change the checkbox as you want
chk.unblockSignals()
    
替换代码0】的最大弊端是它会阻止 所有 signals for the widget - including the ones Qt connects to intern所有y. This can sometimes make it a bit of bug trap, due to unexpected side-effects.
@ekhumoro ...很高兴知道。对于我的目的来说,这很好,因为我在取消检查后直接启用。然而,我很想听听你的替代方案?这似乎是一个经常有用的场景......在不触发事件的情况下操纵UI。
@NickvanDiem。虽然我的评论大致上是真实的,但在我发表评论的时候,我确信我有一个更简单的选择。但似乎我的记忆在作怪,事实证明情况并非如此。我现在能想到的唯一真正的替代方法是断开并重新连接信号--这当然更安全,但没有那么简单。
@ekhumoro ...没有问题。非常感谢你对它的思考 :)
C. Mayer
C. Mayer
发布于 2020-01-15
0 人赞同

@mguijarr的回答说明了一切,但显然他们改变了一些功能。

In QT 5.14.0 it is:

chk.blockSignals(True)
chk.blockSignals(False)
# same syntax for c++ and py at this place