9 Stimmen

QCheckBox: Wie kann man zwischen benutzerinduzierten und programmgesteuerten Zustandsänderungen unterscheiden?

Übersehe ich etwas oder gibt es wirklich keine (fertige / integrierte) Möglichkeit, den Zustand einer QCheckBox programmatisch zu ändern, ohne das Signal "void stateChanged ( int state )" zu senden?

Das oben genannte Signal wird unabhängig davon ausgegeben, ob "void setCheckState ( Qt::CheckState state )" aufgerufen wurde oder der Benutzer den Zustand über die Benutzeroberfläche geändert hat, und es gibt kein "stateEdited"-Signal wie bei QLineEdit.

Wenn es also keine fertige Möglichkeit gibt, zwischen programmatischen und benutzerinduzierten Änderungen des Zustands der QCheckBox zu unterscheiden, und die einzigen Möglichkeiten darin bestehen, das Signal "stateEdited" zu subclassen/hinzuzufügen oder mit "void QObject::blockSignals( bool block )" herumzufummeln, warum muss das so sein, d. h. ist es eine (Art) Inkonsistenz (in Qt)?

16voto

TimW Punkte 8157

Wenn Sie nur über Benutzereingaben informiert werden müssen, hören Sie auf

QAbstractButton::clicked( bool checked );

Andernfalls verbinden Sie sich mit

QAbstractButton::toggled( bool checked );

o

QCheckBox::stateChanged( int state);

9voto

Marc Mutz - mmutz Punkte 23597

Ein Ansatz, der für alle Signale und Widgets funktioniert, besteht darin, die Aufrufe an setChecked() in einem Paar von blockSignals() Anrufe:

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

oder mit etwas, das jeder Qt-Programmierer in seinem Werkzeugkasten hat:

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 Klasse. Verwendung:

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

BEARBEITEN 2013-12-10: Qt 5.3 wird QSignalBlocker eingebaut haben.

1voto

Wildcat Punkte 8601

Wenn Sie möchten, dass

den Zustand einer QCheckBox programmatisch ändern

verwenden. setCheckState méthode.

P.S. Ich verstehe nicht, was das bedeutet

den Zustand einer QCheckBox ändern ... ein "void stateChanged ( int state )"-Signal ausgeben

Wahrscheinlich sollten Sie lesen Signale und Slots Thema genauer zu betrachten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X