2009-12-06 6 views
6

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

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

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

ответ

13

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

QAbstractButton::clicked(bool checked); 

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

QAbstractButton::toggled(bool checked); 

или

QCheckBox::stateChanged(int state); 
+0

Это единственное, спасибо! – mlvljr

1

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

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

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

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

изменения состояния в QCheckBox ... испуская «недействительным StateChanged (целое состояние)» сигнал

Вероятно, вы должны более внимательно прочитать Signals and Slots тему.

+0

Это означает, что мой английский BAD :), а также следующее: 1) вы вызываете setCheckState (...) 2) «void stateChanged (int state)» не испускается. Другими словами, меня интересует поведение, подобное QLineEdit. Quoting Qt documentation: "void QLineEdit :: textEdited (const QString & text) [signal] ... В отличие от textChanged(), этот сигнал не выдается, когда текст изменяется программно, например, путем вызова setText()." – mlvljr

+0

Я получаю вашу мысль.Я вижу только один вариант: создайте и используйте вместо класса QCheckBox свой собственный класс, основанный на QCheckBox (подкласс), а затем определите новый метод (или redifine setChecked). Ваш метод должен отличаться от одного из QCheckBox (http://qt.gitorious.org/qt/qt/blobs/master/src/gui/widgets/qcheckbox.cpp) только в последней строке кода. Вам не нужно испускать stateChanged (состояние); Но я не думаю, что это хорошее решение ... Зачем вам такое поведение? – Wildcat

+0

Кажется, что необходимо настроить некоторые виджеты, сигналы которых уже подключены, не излучая их (сигналы). Во всяком случае, я всегда могу использовать «QObject :: blockSignals (bool block)». Постскриптум (off.) Ваша веб-страница на странице на русском языке, вы действительно оттуда? – mlvljr

9

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

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

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

EDIT 2013-12-10: Qt 5.3 будет иметь QSignalBlocker встроенный.

+2

Я не ОП, но отличный ответ, спасибо. – ttvd

Смежные вопросы