如何在不触发事件的情况下禁用 QCheckBox?

4
我想知道在pyqt中是否有一种方法可以禁用(setCheckState)复选框(QCheckBox)而不触发事件?所以它只是一个显示更改,复选框现在未被选中,但不会触发我连接的方法。感谢任何帮助。如果可能的话,希望有一个基本示例。
2个回答

3
您可以在禁用 QCheckBox 之前简单地阻止信号,并在之后重新启用它们。假设 chk 是您的 QCheckBox 对象,请执行以下操作:
chk.blockSignals()
# then you change the checkbox as you want
chk.unblockSignals()

blockSignals() 的一个很大的缺点是它会阻塞掉小部件的 所有 信号 - 包括 Qt 内部连接的信号。这有时会导致一些意外的副作用,使其成为一个小 bug 陷阱。 - ekhumoro
@ekhumoro ...好知道。对于我的目的来说很好,因为我在取消选择后直接启用。然而,我很想听听你的替代方案?这似乎是一个经常有用的场景...可以操纵UI而不触发事件。 - Nick van Diem
@NickvanDiem。尽管我的评论在广义上是正确的,但当我发表评论时,我确信有一个更简单的选择。但似乎我的记忆在欺骗我,结果并非如此。现在我能想到的唯一真正的替代方案是断开并重新连接信号-这肯定更安全,但不够简单。 - ekhumoro
@ekhumoro... 没问题。非常感谢您的思考 :) - Nick van Diem

2

@mguijarr的答案已经说得很清楚了,但是他们显然对函数进行了一些更改。

在QT 5.14.0中,它是:

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

Python文档

C++文档

(也许这更适合作为评论,但我需要更多的声望才能发表评论)


1
文档的哪个部分指出了可以使用unblockSignals?我没有看到关于这个方法有任何变化。 - eyllanesc
昨天已经太晚了...我想纠正过时的信息,但只是重复了第二个陈述。我已经修复了它。 - C. Mayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接