在 Qt 中,只有可以被选中(checkable)的按钮类控件才会发出 toggled
信号。
这个信号与 clicked
信号的关键区别在于:toggled
信号只在按钮的“选中状态”发生改变时发射,而 clicked
信号在每次用户点击(或通过键盘等方式激活)时都会发射,无论选中状态是否改变。
具体有哪些按钮?
以下是主要的会发出 toggled
信号的按钮控件:
1. QPushButton
默认情况下,QPushButton 是不可选中的,因此它默认只有 clicked
信号,没有 toggled
信号。
只有当您将其设置为可选中时,它才会有 toggled
信号:
QPushButton *button = new QPushButton("Toggle Button");
button->setCheckable(true); // 关键:设置为可选中
// 现在这个按钮就有 toggled 信号了
connect(button, &QPushButton::toggled, this, bool checked {
qDebug() << "按钮状态变为:" << checked;
});
2. QToolButton
QToolButton 常用于工具栏,它默认也是不可选中的。
同样,需要设置 setCheckable(true)
后,才会有 toggled
信号。
QToolButton *toolButton = new QToolButton();
toolButton->setCheckable(true);
connect(toolButton, &QToolButton::toggled, this, &MyClass::onToolButtonToggled);
3. QRadioButton
单选框默认就是可选中的,因此它天然就有 toggled
信号。
QRadioButton *radioButton = new QRadioButton("Option 1");
// 无需 setCheckable(true),因为它生来就是 checkable 的
connect(radioButton, &QRadioButton::toggled, this, bool checked {
if (checked) {
// 这个单选按钮被选中了
}
});
4. QCheckBox
复选框和单选框一样,默认就是可选中的,所以也有 toggled
信号。
QCheckBox *checkBox = new QCheckBox("I agree");
connect(checkBox, &QCheckBox::toggled, this, bool checked {
qDebug() << "复选框状态:" << checked;
});
toggled
和 clicked
信号的区别
这是一个非常重要的区别,理解它能避免很多 bug:
信号 | 触发条件 | 传递的参数 | 备注 |
---|---|---|---|
toggled(bool checked) | 选中状态发生变化时 | 新的选中状态 (checked ) | 与用户交互无关。即使通过代码调用 setChecked() 改变状态,也会发射此信号。 |
clicked(bool checked) | 用户点击按钮时 | 点击后的选中状态 (checked ) | 仅由用户交互(或模拟点击)触发。如果点击没有改变选中状态(例如,点击一个已经选中的单选按钮),则不会发射 toggled 信号,但会发射 clicked 信号。 |
示例说明:
假设有一个设置为可选中的 QPushButton,初始状态为未选中 (checked = false
)。
- 第一次点击:
- 状态从
false
变为true
。 - 同时发射
clicked(true)
和toggled(true)
。
- 状态从
- 第二次点击:
- 状态从
true
变回false
。 - 同时发射
clicked(false)
和toggled(false)
。
- 状态从
- 通过代码改变状态:
- 调用
button->setChecked(true)
,如果它当前是false
。 - 只发射
toggled(true)
,不会发射clicked(true)
。
- 调用
总结
- 拥有
toggled
信号的按钮:所有可选中(checkable) 的按钮,包括设置了setCheckable(true)
的 QPushButton 和 QToolButton,以及天生的 QRadioButton 和 QCheckBox。 - 何时使用
toggled
:当你关心按钮的选中状态(checked state)是否改变时,应该连接这个信号。这是最可靠的方式。 - 何时使用
clicked
:当你只关心用户是否执行了点击操作,而不太关心状态如何变化时,使用这个信号。
在实际开发中,如果您的逻辑依赖于按钮的“开”或“关”状态,使用 toggled
信号通常是更安全、更合适的选择。