QCheckBox: como para diferenciar entre as alterações induzidas pelo utilizador para o estado e aqueles feitos por meio de programação?

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

Pergunta

Do I perder algo ou não há realmente nenhuma (/ built-in pronto) maneira de programaticamente alterar o estado de um QCheckBox sem emitir o "vazio stateChanged (estado int)" sinal?

O sinal acima mencionado é emitido independentemente de "vazio setCheckState (estado Qt :: CheckState)" foi chamado ou o usuário alterou o estado através da interface do usuário, e não há sinal de "stateEdited" como com o QLineEdit.

Então, se não há nenhuma maneira pronta para diferenciar entre mudanças programáticas e induzida pelo usuário para o estado da QCheckBox, e as únicas opções são subclassificação / adicionar o sinal "stateEdited" ou mexer com "vazio QObject :: blockSignals ( bloco bool)", por que é que isto tem que ser assim, ou seja, é um (uma espécie de) inconsistência (em Qt)?

Foi útil?

Solução

Se você só precisa de ser informado de entrada do usuário, ouvir

QAbstractButton::clicked( bool checked );

Caso contrário conectar a

QAbstractButton::toggled( bool checked );

ou

QCheckBox::stateChanged( int state);

Outras dicas

Uma abordagem que funciona para todos os sinais e widgets é envolver as chamadas para setChecked() em um par de chamadas blockSignals():

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

ou, com algo cada programador Qt terá em sua caixa de ferramentas:

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 classe. Uso:

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

EDIT 2013/12/10:. Qt 5.3 terá QSignalBlocker built-in

Se você quiser

programaticamente alterar o estado de um QCheckBox

setCheckState método.

P.S. Eu não entendo o que isso significa

alterar o estado de um QCheckBox ... emitindo um "vazio stateChanged (estado int)" sinal

Provavelmente você deve ler Sinais e tópico Slots com mais cuidado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top