QCheckBox: как провести различие между пользовательскими изменениями состояния и программными изменениями? - PullRequest
8 голосов
/ 06 декабря 2009

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

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

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

Ответы [ 3 ]

14 голосов
/ 07 декабря 2009

Если вам нужно только сообщить о вводе пользователя, прослушайте

QAbstractButton::clicked( bool checked );

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

QAbstractButton::toggled( bool checked );

или

QCheckBox::stateChanged( int state);
9 голосов
/ 27 апреля 2011

Подход, который работает для всех сигналов и виджетов, - заключить вызовы в 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 ); }
};

a RAII класс. Использование:

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

РЕДАКТ. 2013-12-10: Qt 5.3 будет иметь встроенный QSignalBlocker.

1 голос
/ 07 декабря 2009

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

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

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

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

изменить состояние QCheckBox ... испуская сигнал void stateChanged (int state)

Возможно, вам следует прочитать тему Сигналы и слоты более внимательно.

...