在 pyQt4 中 QCheckBox 的 clicked() 和 stateChanged() 信号有啥区别?
Posted
技术标签:
【中文标题】在 pyQt4 中 QCheckBox 的 clicked() 和 stateChanged() 信号有啥区别?【英文标题】:In pyQt4 what is the difference between clicked() and stateChanged() signals for QCheckBox?在 pyQt4 中 QCheckBox 的 clicked() 和 stateChanged() 信号有什么区别? 【发布时间】:2021-06-16 05:43:24 【问题描述】:在我的实验中,我发现在某些情况下,图形检查显示可以在不发送stateChanged
的情况下更改,但clicked
似乎总是消失。有什么区别?
特别是这样的:
checkBox.stateChanged.connect(func)
def func(state):
print "Not allowed!"
checkBox.setChecked(not bool(state))
不适用于stateChanged
。它似乎只是每隔一次进入func
。到底是怎么回事?如果我将stateChanged
替换为clicked
,它将按预期工作。
【问题讨论】:
如果你想阻止用户改变状态,你应该禁用或断开按钮。通过在插槽内重新设置状态来破坏状态只是自找麻烦。 虽然密切相关,但 QCheckBox 的 check state 和 checked not 是一回事。状态应该只用于三态检查,如果你只需要布尔值,你不应该使用它并选择基本的toggled
/setChecked
和所有 QAbstractButtons 一样。
这是一个最小的例子。在我的真实代码中,您最终只会在某些条件下撤消操作。切换也是信号吗?如果是,与点击有什么不同?
【参考方案1】:
不要忘记您可以通过编程方式更改复选框状态。 checkbox.setChecked(True)
将发出 stateChanged
但不会发出 clicked
【讨论】:
如果是这样,我想知道为什么我在示例案例中没有得到无限循环? @Mastiff 这是由于各种后备系统,巧合的是,没有引起递归,因为它是由用户交互激活的。正如 ekhumuro 所说,像这样“重置”值肯定不是一个好主意。 @Mastiff 没有无限循环,因为setChecked
不做任何事情,如果当前值等于您尝试分配的值,则返回。 qt setter 中的常见模式是检查并返回新值是否等于当前值,特别是为了避免无限循环。以上是关于在 pyQt4 中 QCheckBox 的 clicked() 和 stateChanged() 信号有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章