QCheckBox:どのようにユーザー誘導状態に変更し、プログラム作られたものを区別するの?

StackOverflow https://stackoverflow.com/questions/1856544

質問

私は何かを欠場するか、プログラム「のボイドのstateChanged(状態をint型)」信号を発することなく、QCheckBoxの状態を変更する(レディ/内蔵)の方法は本当にありませんか?

上記信号にかかわらずか「空隙setCheckState(Qtの::にcheckState状態)」の放出されると呼ばれていたか、ユーザがUIを介して状態を変更し、およびにQLineEdit有するようには「stateEdited」信号が存在しません。

だから、そこQCheckBoxの状態に、プログラムやユーザーによる変化を区別するために何の準備方法はありません、そして唯一のオプションは、(「stateEdited」信号を追加したり、「空のQObject :: blockSignalsをいじる/サブクラス化されている場合ブールブロック)」、なぜこれがそうする必要がない、すなわち、それ(Qtの中に)矛盾()のいくつかの並べ替えているのですか?

役に立ちましたか?

解決

あなたが唯一のユーザー入力の通知をする必要がある場合は、

に耳を傾けます
QAbstractButton::clicked( bool checked );

それ以外の場合に接続します。

QAbstractButton::toggled( bool checked );

または

QCheckBox::stateChanged( int state);

他のヒント

すべての信号とウィジェットのために働くのアプローチは、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 ); }
};

A RAII のクラス。使用方法:

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

のEDIT 2013年12月10日:のQtの5.3はQSignalBlockerビルトインを持つことになります。

あなたがしたい場合は、

  

プログラム的QCheckBoxの状態を変更する

setCheckState のメソッドを使用します。

P.S。私はそれがどういう意味を理解していない

  

"空のstateChanged(int型の状態)" を発する... QCheckBoxの状態を変更する信号

おそらくあなたはより慎重にシグナルとスロットのトピックをお読みください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top