QCheckBox: Wie zwischen Benutzer-induzierten Veränderungen in dem Zustand zu unterscheiden, und diejenigen, programmatisch gemacht?
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)?
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.