QCheckBox: cómo diferenciar entre los cambios inducidos por el usuario a otro y de las realizadas mediante programación?

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

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)?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top