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

时间:2009-12-06 20:43:10

标签: qt pyqt qt4 pyqt4 qcheckbox

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

无论是否调用“void setCheckState(Qt :: CheckState state)”或用户是否通过ui更改了状态,都会发出上述信号,并且没有像QLineEdit那样的“stateEdited”信号。 / p>

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

3 个答案:

答案 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主题。