QCHECKBOX : 사용자로 인한 상태 변경과 프로그래밍 방식으로 만든 변경 사항을 구별하는 방법은 무엇입니까?

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

문제

무언가를 놓치거나 "void statechanged (int state)"신호를 방출하지 않고 QCheckbox의 상태를 프로그래밍 방식으로 변경할 수있는 (준비 / 내장) 방법이 없습니까?

위에서 언급 한 신호는 "void setcheckstate (qt :: Checkstate State)"가 호출되었는지 또는 사용자가 UI를 통해 상태를 변경했는지 여부에 관계없이 방출됩니다.

따라서 QCHECKBOX의 상태로 프로그래밍 방식과 사용자로 인한 변경 사항을 구별 할 준비가되지 않은 경우, 유일한 옵션은 "진술 된"신호를 서브 클래싱 / 추가하거나 "void Qobject :: BlockSignals (BOOL BLOCK)를 사용하는 것입니다. ", 왜 이것이 그렇게되어야 하는가?

도움이 되었습니까?

해결책

사용자 입력에 대한 정보 만 있으면됩니다.

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

raii 수업. 용법:

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

2013-12-10 편집 : QT 5.3에는 QsignalBlocker가 내장되어 있습니다.

당신이 원한다면

QCHECKBOX의 상태를 프로그래밍 방식으로 변경합니다

사용 setcheckstate 방법.

추신 : 나는 그것이 무엇을 의미하는지 이해하지 못한다

QCHECKBOX의 상태 변경 ... "void stateChanged (int state)"신호 방출

아마 당신은 읽어야 할 것입니다 신호 및 슬롯 더 신중하게 주제.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top