QCheckBox:как отличить изменения состояния, вызванные пользователем, от изменений, внесенных программно?

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

Вопрос

Я что-то упускаю или действительно нет (готового/встроенного) способа программно изменить состояние QCheckBox без выдачи сигнала «void stateChanged (int state)»?

Вышеупомянутый сигнал генерируется независимо от того, был ли вызван «void setCheckState ( Qt::CheckState state )» или пользователь изменил состояние через пользовательский интерфейс, и нет сигнала «stateEdited», как в случае с QLineEdit.

Итак, если нет готового способа различать программные и пользовательские изменения состояния QCheckBox, и единственными вариантами являются создание подклассов/добавление сигнала "stateEdited" или возня с "void QObject::blockSignals( bool block) ", почему это должно быть так, т. е. является ли это (какой-то) несогласованностью (в Qt)?

Это было полезно?

Решение

Если вам нужно только получать информацию о вводе пользователя, слушайте

QAbstractButton::clicked( bool checked );

В противном случае подключитесь к

QAbstractButton::toggled( bool checked );

или

QCheckBox::stateChanged( int state);

Другие советы

Подход, который работает для всех сигналов и виджетов, состоит в том, чтобы обернуть вызовы setChecked() в паре blockSignals() звонки:

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

или, что-то, что есть в наборе инструментов каждого Qt-программиста:

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 ); }
};

а РАИИ сорт.Использование:

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

РЕДАКТИРОВАТЬ 10 ​​декабря 2013 г.: Qt 5.3 будет иметь встроенный QSignalBlocker.

Если вы хотите

программно изменить состояние QCheckBox

использовать setCheckState метод.

P.S.Я не понимаю, что это значит

изменить состояние QCheckBox...выдача сигнала «void stateChanged (int state)»

Наверное, вам стоит прочитать Сигналы и слоты тему внимательнее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top