代码之家  ›  专栏  ›  技术社区  ›  mlvljr

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

  •  8
  • mlvljr  · 技术社区  · 15 年前

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

    因此,如果没有现成的方法来区分对QCheckBox状态的编程更改和用户诱导更改,并且唯一的选项是子类化/添加“stateEdited”信号或摆弄“void QObject::blockSignals(bool block)”,那么为什么一定要这样,也就是说,这是一种(某种)不一致性(在Qt中)?

    3 回复  |  直到 7 年前
        1
  •  16
  •   TimW    15 年前

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

    QAbstractButton::clicked( bool checked );
    

    QAbstractButton::toggled( bool checked );
    

    QCheckBox::stateChanged( int state);
    
        2
  •  9
  •   Marc Mutz - mmutz    11 年前

    一种适用于所有信号和小部件的方法是将调用包装到 setChecked() 一双 blockSignals() 电话:

    const bool blocked = but->signalsBlocked();
    but->blockSignals( true );
    but->setChecked( true );
    but->blockSignals( blocked );
    

    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 ); }
    };
    

    A. RAII 班级。用法:

    const QSignalBlocker blocker( but );
    but->setChecked( true );
    

        3
  •  1
  •   Wildcat    15 年前

    以编程方式更改QCheckBox的状态

    使用 setCheckState

    另外,我不明白这是什么意思

    更改QCheckBox的状态。。。发出“无效状态更改(int状态)”信号

    Signals and Slots 更仔细地讨论这个话题。