QCheckBox: Wie zwischen Benutzer-induzierten Veränderungen in dem Zustand zu unterscheiden, und diejenigen, programmatisch gemacht?

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

Frage

Habe ich etwas verpasst oder es gibt wirklich keine (ready / eingebaut) Art und Weise programmatisch den Zustand eines QCheckBox zu ändern, ohne die „Leere statechanged (int state)“ Emissionssignal?

Das oben erwähnte Signal ausgesendet wird, unabhängig davon, ob „Leere setCheckState (Qt :: Checkstate-Zustand)“ genannt wurde oder der Benutzer verändert den Zustand über den ui, und es gibt keine „stateEdited“ -Signal wie mit dem QLineEdit.

Also, wenn es kein bereiter Weg zwischen programmatischen und benutzerbedingten Veränderungen in den Zustand des QCheckBox, und die einzigen Optionen sind Subklassen / Hinzufügen des „stateEdited“ -Signal oder das Hantieren mit „Void QObject :: blockSignals zu unterscheiden ( bool Block)“, warum das so sein muss, dh es ist eine (eine Art) Inkonsistenz (in Qt)?

War es hilfreich?

Lösung

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

QAbstractButton::clicked( bool checked );

Ansonsten Verbindung zu

QAbstractButton::toggled( bool checked );

oder

QCheckBox::stateChanged( int state);

Andere Tipps

Ein Ansatz, der für alle Signale und Widgets funktioniert, ist die Anrufe zu wickeln in einem Paar setChecked() Anrufe blockSignals():

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

oder, mit etwas, das jedem Qt-Programmierer wird 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 ); }
};

RAII Klasse. Verbrauch:

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

EDIT 2013.12.10:. Qt 5.3 wird QSignalBlocker eingebaut haben

Wenn Sie auf

  

programmatisch den Zustand eines QCheckBox ändern

setCheckState Methode.

P. S. Ich verstehe nicht, was es bedeutet,

  

Ändern Sie den Zustand eines QCheckBox ... eine "Leere statechanged (int state)" Emissionssignal

Wahrscheinlich sollten Sie lesen Signale und Slots Thema vorsichtiger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top