9

「void stateChanged ( int state )」シグナルを発行せずに QCheckBox の状態をプログラムで変更する (準備ができている/組み込みの) 方法は本当にありませんか?

上記のシグナルは、「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 );

EDIT 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 に答える