我是否遗漏了某些东西或者没有(现成/内置)方式以编程方式更改QCheckBox的状态而不会发出“void stateChanged(int state)”信号?
无论是否调用“void setCheckState(Qt :: CheckState state)”或用户是否通过ui更改了状态,都会发出上述信号,并且没有像QLineEdit那样的“stateEdited”信号。 / p>
因此,如果没有现成的方法来区分编程和用户引发的QCheckBox状态的变化,并且唯一的选择是子类化/添加“stateEdited”信号或摆弄“void QObject :: blockSignals”( bool block)“,为什么必须如此,即它是(某种)不一致(在Qt中)?
答案 0 :(得分:14)
如果您只需要了解用户输入,请收听
QAbstractButton::clicked( bool checked );
否则连接到
QAbstractButton::toggled( bool checked );
或
QCheckBox::stateChanged( int state);
答案 1 :(得分:9)
适用于所有信号和小部件的方法是在setChecked()
次呼叫中将呼叫包裹到blockSignals()
:
const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
或者,每个Qt程序员都会在他的工具箱中拥有一些东西:
class QSignalBlocker {
QObject * const o;
const bool blocked;
public:
explicit QSignalBlocker( QObject * o )
: o( o ),
blocked( o && o->signalsBlocked() )
{
if ( o ) o->blockSignals( true );
}
~QSignalBlocker() { if ( o ) o->blockSignals( blocked ); }
};
RAII课程。用法:
const QSignalBlocker blocker( but );
but->setChecked( true );
编辑2013-12-10: Qt 5.3将内置QSignalBlocker。
答案 2 :(得分:1)
如果你想
以编程方式更改QCheckBox的状态
使用setCheckState方法。
P.S。我不明白它是什么意思
更改QCheckBox的状态...发出“void stateChanged(int state)”信号
您可能应该更仔细地阅读Signals and Slots主题。