QCheckBox: cómo diferenciar entre los cambios inducidos por el usuario a otro y de las realizadas mediante programación?
Pregunta
¿Me perdí algo o hay realmente ninguna manera (listo / built-in) para cambiar mediante programación el estado de un QCheckBox sin emitir el "vacío stateChanged (estado int)" señal?
La señal mencionada anteriormente se emite independientemente de si "setCheckState void (Qt :: estado CheckState)" fue llamado o el usuario cambia el estado a través de la interfaz de usuario, y no hay señal de "stateEdited" como con el QLineEdit.
Por lo tanto, si no hay manera para hacer las diferencias entre los cambios programáticos e inducidos por el usuario para el estado de la QCheckBox, y las únicas opciones son la subclasificación / añadir la señal "stateEdited" o tocar el violín con "vacíos QObject :: blockSignals ( bloque bool)", ¿por qué tiene que ser así, es decir, que es un (una especie de) inconsistencia (en Qt)?
Solución
Si sólo necesita ser informado de la entrada del usuario, escuchar
QAbstractButton::clicked( bool checked );
De lo contrario conectar a
QAbstractButton::toggled( bool checked );
o
QCheckBox::stateChanged( int state);
Otros consejos
Un enfoque que funciona para todas las señales y widgets es envolver las llamadas a setChecked()
en un par de llamadas blockSignals()
:
const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
o, con algo que cada programador Qt tendrá en su caja de herramientas:
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 clase. Uso:
const QSignalBlocker blocker( but );
but->setChecked( true );
EDITAR 12/10/2013:. Qt 5.3 tendrá QSignalBlocker incorporada
Si desea
programáticamente cambiar el estado de un QCheckBox
utilizar setCheckState método.
P.S. No entiendo qué significa
cambiar el estado de un QCheckBox ... emitiendo un "vacío stateChanged (estado int)" señal
Probablemente usted debe leer Señales y ranuras tema con más cuidado.