在 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 statechecked not 是一回事。状态应该只用于三态检查,如果你只需要布尔值,你不应该使用它并选择基本的toggled/setChecked 和所有 QAbstractButtons 一样。 这是一个最小的例子。在我的真实代码中,您最终只会在某些条件下撤消操作。切换也是信号吗?如果是,与点击有什么不同? 【参考方案1】:

不要忘记您可以通过编程方式更改复选框状态。 checkbox.setChecked(True) 将发出 stateChanged 但不会发出 clicked

【讨论】:

如果是这样,我想知道为什么我在示例案例中没有得到无限循环? @Mastiff 这是由于各种后备系统,巧合的是,没有引起递归,因为它是由用户交互激活的。正如 ekhumuro 所说,像这样“重置”值肯定不是一个好主意。 @Mastiff 没有无限循环,因为setChecked 不做任何事情,如果当前值等于您尝试分配的值,则返回。 qt setter 中的常见模式是检查并返回新值是否等于当前值,特别是为了避免无限循环。

以上是关于在 pyQt4 中 QCheckBox 的 clicked() 和 stateChanged() 信号有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4单选框QCheckBox

pyqt4正确连接QCheckbox状态

使用 pyqt4 创建类信号

将图标移动到 QCheckBox 中文本的右侧

如何在没有 QCheckBox 框的情况下绘制本机复选标记

使用PyQt中的QCheckBox或QComboBox更改小部件可见性