9

我是否错过了什么或者真的没有(准备好/内置)方式以编程方式更改 QCheckBox 的状态而不发出“void stateChanged(int state)”信号?

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

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

4

3 回答 3

16

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

QAbstractButton::clicked( bool checked );

否则连接到

QAbstractButton::toggled( bool checked );

或者

QCheckBox::stateChanged( int state);
于 2009-12-07T14:04:47.257 回答
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。

于 2011-04-27T13:10:20.817 回答
1

如果你想

以编程方式更改 QCheckBox 的状态

使用setCheckState方法。

PS我不明白这是什么意思

改变 QCheckBox 的状态...发出“void stateChanged (int state)”信号

可能您应该更仔细地阅读信号和插槽主题。

于 2009-12-06T21:12:00.233 回答