QCheckBox:如何区分用户引发的状态更改和以编程方式进行的更改?

mlv*_*ljr 8 qt qt4 pyqt pyqt4 qcheckbox

我是否遗漏了某些东西或者没有(现成/内置)方式以编程方式更改QCheckBox的状态而不会发出"void stateChanged(int state)"信号?

无论是否调用"void setCheckState(Qt :: CheckState state)"或者用户是否通过ui改变了状态,都会发出上述信号,并且没有像QLineEdit那样的"stateEdited"信号.

因此,如果没有现成的方法来区分编程和用户引发的QCheckBox状态的变化,并且唯一的选择是子类化/添加"stateEdited"信号或摆弄"void QObject :: blockSignals(bool block) ",为什么必须如此,即它是(某种)不一致(在Qt中)?

Tim*_*imW 14

如果您只需要了解用户输入,请收听

QAbstractButton::clicked( bool checked );
Run Code Online (Sandbox Code Playgroud)

否则连接到

QAbstractButton::toggled( bool checked );
Run Code Online (Sandbox Code Playgroud)

要么

QCheckBox::stateChanged( int state);
Run Code Online (Sandbox Code Playgroud)


Mar*_*utz 9

适用于所有信号和小部件的方法是将调用包装setChecked()在一对blockSignals()调用中:

const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
Run Code Online (Sandbox Code Playgroud)

或者,每个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 ); }
};
Run Code Online (Sandbox Code Playgroud)

一个RAII类.用法:

const QSignalBlocker blocker( but );
but->setChecked( true );
Run Code Online (Sandbox Code Playgroud)

编辑2013-12-10: Qt 5.3将内置QSignalBlocker.