Russian Qt Forum
Ноябрь 27, 2024, 21:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Срабатывание сигналов, когда вы этого не хотите  (Прочитано 4288 раз)
bibelwort
Гость
« : Сентябрь 19, 2010, 12:00 »

Здравствуйте! У меня такой вопрос: как вы справляетесь с тем, что многие сигналы от объектов посылаются тогда, когда действие вызывается программно, а не когда пользователь работает с программой? Как эффективно отслеживать этот момент? На данный момент я использую флаги, но мне кажется, что гуру программирования вряд ли так работают Улыбающийся Подскажите, какие способы еще есть?
Заранее всем спасибо!

ПС. blockSignals не очень подходит, так как виджетов много и для каждого вызывать эту процедуру - самоубийство, вот если бы она передавалась от родителя - потомку, тогда было бы хорошо Улыбающийся
« Последнее редактирование: Сентябрь 19, 2010, 12:03 от bibelwort » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Сентябрь 19, 2010, 12:03 »

Можно примеры?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
bibelwort
Гость
« Ответ #2 : Сентябрь 19, 2010, 12:07 »

Например часто сигналы вызываются процедурой setupUi(), так как дизайнер генерирует код, где создаются объекты и одновременно задаются начальные значения слайдеров или спинбоксов, соответственно вызывая сигналы. Собственно здесь флаги полезны, так как точно известно, где вызываются сигналы, но как быть, в других местах, за всем трудно уследить...
Записан
Kolobok
Гость
« Ответ #3 : Сентябрь 19, 2010, 12:41 »

Плохой пример. Обьекты только что созданы и их сигналы еще ни с чем не соединены.
Записан
bibelwort
Гость
« Ответ #4 : Сентябрь 19, 2010, 13:06 »

Плохой пример. Обьекты только что созданы и их сигналы еще ни с чем не соединены.
Да, согласен, здесь ошибся.
Тогда такой пример: С каждым элементом комбобокса связан набор данных, при выборе какого-либо элемента данные отображаются в различных виджетах, то есть программно изменяются их значения и обрабатывать их сигналы не нужно (происходит инициализация значений). Сигналы нужно обрабатывать только тогда, когда пользователь меняет значения. В данном примере проблема в том, что комбобокс находится в другом виджете (относится к другому cpp файлу), то есть флагом здесь не обойтись.
Если кто знает, какая общая методология существует по использованию сигнал-слотов, особенно в аспекте программного вызова сигналов. На данный момент проблема остро чувствуется при написании большого многоэлементного окна настроек приложения. Спасибо.
Записан
Kolobok
Гость
« Ответ #5 : Сентябрь 19, 2010, 13:19 »

Часто при ручном/программном изменении значения генерируются разные сигналы. Например

Цитировать
void QLineEdit::textChanged ( const QString & text )   [signal]
This signal is emitted whenever the text changes. The text argument is the new text.
Unlike textEdited(), this signal is also emitted when the text is changed programmatically, for example, by calling setText().

void QLineEdit::textEdited ( const QString & text )   [signal]
This signal is emitted whenever the text is edited. The text argument is the next text.
Unlike textChanged(), this signal is not emitted when the text is changed programmatically, for example, by calling setText().

Посмотри QDataWidgetMapper.
« Последнее редактирование: Сентябрь 19, 2010, 13:26 от Kolobok » Записан
bibelwort
Гость
« Ответ #6 : Сентябрь 19, 2010, 13:35 »

Часто при ручном/программном изменении значения генерируются разные сигналы.
Посмотри QDataWidgetMapper.

Если есть возможность, я использую разные функции для изменения значений, но в частности комбобоксы и слайдеры имеют только одну функцию, а эти виджеты у меня гораздо чаще используются.
Спасибо за QDataWidgetMapper, обязательно посмотрю и перейду в будущем на модельную систему, но пока у меня совсем нет времени все переписывать на новый лад Грустный
Записан
Kolobok
Гость
« Ответ #7 : Сентябрь 19, 2010, 13:56 »

Цитировать
void QAbstractSlider::sliderMoved ( int value )   [signal]
This signal is emitted when sliderDown is true and the slider moves. This usually happens when the user is dragging the slider. The value is the new slider position.
This signal is emitted even when tracking is turned off.

void QComboBox::activated ( int index )   [signal]
This signal is sent when the user chooses an item in the combobox. The item's index is passed. Note that this signal is sent even when the choice is not changed. If you need to know when the choice actually changes, use signal currentIndexChanged().
Записан
bibelwort
Гость
« Ответ #8 : Сентябрь 19, 2010, 14:18 »

void QAbstractSlider::sliderMoved ( int value )   [signal]
This signal is emitted when sliderDown is true and the slider moves. This usually happens when the user is dragging the slider. The value is the new slider position.
This signal is emitted even when tracking is turned off.

void QComboBox::activated ( int index )   [signal]
This signal is sent when the user chooses an item in the combobox. The item's index is passed. Note that this signal is sent even when the choice is not changed. If you need to know when the choice actually changes, use signal currentIndexChanged().


Оооо.... Огромное спасибо, я даже не обращал раньше на эти сигналы внимания, вы открыли мне глаза! Спасибо большое! Вопрос я снимаю с рассмотрения, ибо сам дурак. Всем спасибо! Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 23.