Russian Qt Forum
Ноябрь 27, 2024, 21:38
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Срабатывание сигналов, когда вы этого не хотите
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Срабатывание сигналов, когда вы этого не хотите (Прочитано 4288 раз)
bibelwort
Гость
Срабатывание сигналов, когда вы этого не хотите
«
:
Сентябрь 19, 2010, 12:00 »
Здравствуйте! У меня такой вопрос: как вы справляетесь с тем, что многие сигналы от объектов посылаются тогда, когда действие вызывается программно, а не когда пользователь работает с программой? Как эффективно отслеживать этот момент? На данный момент я использую флаги, но мне кажется, что гуру программирования вряд ли так работают
Подскажите, какие способы еще есть?
Заранее всем спасибо!
ПС. blockSignals не очень подходит, так как виджетов много и для каждого вызывать эту процедуру - самоубийство, вот если бы она передавалась от родителя - потомку, тогда было бы хорошо
«
Последнее редактирование: Сентябрь 19, 2010, 12:03 от bibelwort
»
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #1 :
Сентябрь 19, 2010, 12:03 »
Можно примеры?
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
bibelwort
Гость
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #2 :
Сентябрь 19, 2010, 12:07 »
Например часто сигналы вызываются процедурой setupUi(), так как дизайнер генерирует код, где создаются объекты и одновременно задаются начальные значения слайдеров или спинбоксов, соответственно вызывая сигналы. Собственно здесь флаги полезны, так как точно известно, где вызываются сигналы, но как быть, в других местах, за всем трудно уследить...
Записан
Kolobok
Гость
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #3 :
Сентябрь 19, 2010, 12:41 »
Плохой пример. Обьекты только что созданы и их сигналы еще ни с чем не соединены.
Записан
bibelwort
Гость
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #4 :
Сентябрь 19, 2010, 13:06 »
Цитата: Kolobok от Сентябрь 19, 2010, 12:41
Плохой пример. Обьекты только что созданы и их сигналы еще ни с чем не соединены.
Да, согласен, здесь ошибся.
Тогда такой пример: С каждым элементом комбобокса связан набор данных, при выборе какого-либо элемента данные отображаются в различных виджетах, то есть программно изменяются их значения и обрабатывать их сигналы не нужно (происходит инициализация значений). Сигналы нужно обрабатывать только тогда, когда пользователь меняет значения. В данном примере проблема в том, что комбобокс находится в другом виджете (относится к другому cpp файлу), то есть флагом здесь не обойтись.
Если кто знает, какая общая методология существует по использованию сигнал-слотов, особенно в аспекте программного вызова сигналов. На данный момент проблема остро чувствуется при написании большого многоэлементного окна настроек приложения. Спасибо.
Записан
Kolobok
Гость
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #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
Гость
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #6 :
Сентябрь 19, 2010, 13:35 »
Цитата: Kolobok от Сентябрь 19, 2010, 13:19
Часто при ручном/программном изменении значения генерируются разные сигналы.
Посмотри QDataWidgetMapper.
Если есть возможность, я использую разные функции для изменения значений, но в частности комбобоксы и слайдеры имеют только одну функцию, а эти виджеты у меня гораздо чаще используются.
Спасибо за QDataWidgetMapper, обязательно посмотрю и перейду в будущем на модельную систему, но пока у меня совсем нет времени все переписывать на новый лад
Записан
Kolobok
Гость
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #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
Гость
Re: Срабатывание сигналов, когда вы этого не хотите
«
Ответ #8 :
Сентябрь 19, 2010, 14:18 »
Цитата: Kolobok от Сентябрь 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().
Оооо.... Огромное спасибо, я даже не обращал раньше на эти сигналы внимания, вы открыли мне глаза! Спасибо большое! Вопрос я снимаю с рассмотрения, ибо сам дурак. Всем спасибо!
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...