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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение типа сигнала  (Прочитано 7877 раз)
ElderOrb
Гость
« : Июль 15, 2005, 14:29 »

Возможен ли сабж?.. То есть можно ли из сигнала signal(const QString&) сделать signal(int) или signal() ? Это может понадобиться для реализации, к примеру, следующего:

Имеется виджэт в котором размещены разнообразные контролы (лайнэдиты, комбобоксы и радиобуттоны). Хотелось бы чтобы при изменении значения любого контрола в кэпшене виждэта выставлялся признак модификации.

Решение "в лоб" (сигналы textChanged(const QString&) для QLineEdit, editTextChanged(const QString&)  для QComboBox и  buttonClicked(QAbstractButton*) для группы радиобуттонов подключить к слотам setModifier(const QString&) и setModifier(QAbstractButton*) ) слишком громоздкое.

Тут отлично подошёл бы QSignalMapper если бы каждый контрол при своей модификации испускал сигнал одного и того же типа. Проблема в том, что признак модификации QLineEdit-а - сигнал textChanged и сигнал buttonClicked для группы радиобуттонов имеют разные параметры, и "красиво" использовать сигналмэппер не получится.

Существует ли какой-нибудь простой способ поменять тип сигнала (с потерей переносимой им ноформации конечно)?
Записан
Zmey
Гость
« Ответ #1 : Июль 15, 2005, 16:32 »

Цитата: "ElderOrb"
Возможен ли сабж?.. То есть можно ли из сигнала signal(const QString&) сделать signal(int) или signal() ? Это может понадобиться для реализации, к примеру, следующего:

Имеется виджэт в котором размещены разнообразные контролы (лайнэдиты, комбобоксы и радиобуттоны). Хотелось бы чтобы при изменении значения любого контрола в кэпшене виждэта выставлялся признак модификации.

Решение "в лоб" (сигналы textChanged(const QString&) для QLineEdit, editTextChanged(const QString&)  для QComboBox и  buttonClicked(QAbstractButton*) для группы радиобуттонов подключить к слотам setModifier(const QString&) и setModifier(QAbstractButton*) ) слишком громоздкое.

Тут отлично подошёл бы QSignalMapper если бы каждый контрол при своей модификации испускал сигнал одного и того же типа. Проблема в том, что признак модификации QLineEdit-а - сигнал textChanged и сигнал buttonClicked для группы радиобуттонов имеют разные параметры, и "красиво" использовать сигналмэппер не получится.

Существует ли какой-нибудь простой способ поменять тип сигнала (с потерей переносимой им ноформации конечно)?


А можешь сделать, чтобы из этих сигналов испускался твой один самодельный сигнал, а потом ты этот сигнал ловишь и...
Типа того:
connect( aButton, SIGNAL(clicked()), SIGNAL(myUsefulSignal()) );
Записан
ElderOrb
Гость
« Ответ #2 : Июль 15, 2005, 16:36 »

Чего-то в этом духе мне и хотелось бы добиться... Но вот как? Не могу же я подключить сигнал одного типа к сигналу другого?.. Или могу?
Записан
L.Marvell
Гость
« Ответ #3 : Июль 15, 2005, 16:56 »

Цитата: "ElderOrb"
Чего-то в этом духе мне и хотелось бы добиться... Но вот как? Не могу же я подключить сигнал одного типа к сигналу другого?.. Или могу?


Цитата из книги  Jasmin Blanchette, Mark Summerfield (хотя возможно я неправильно понял постановку задачи):

"Сигнал может быть подключен к другому сигналу:

connect(lineEdit, SIGNAL(textChanged(const QString &)),
        this, SIGNAL(updateRecord(const QString &)));            
           
Когда посылается первый сигнал, то вслед за ним подается и второй. С точки зрения программы, соединение типа сигнал-сигнал ничем не отличается от соединения типа сигнал-слот."
Записан
ElderOrb
Гость
« Ответ #4 : Июль 15, 2005, 17:01 »

Проблема в том что в моём случае сигналы разных типов... А насколько я знаю подключения вида
connect(sender, SIGNAL(senderSignal(const QString& )),
receiver, SLOT(receiverSlot(in))) , (т.е. подключения между сигналами разных типов) невозможны.
Записан
KOSchMAR
Гость
« Ответ #5 : Июль 15, 2005, 23:46 »

если с потерей информации, то что мешает использовать SLOT(MyVoidSlot())?
Записан
ElderOrb
Гость
« Ответ #6 : Июль 16, 2005, 12:27 »

действительно ничего! ж) По каким-то причинам я был убеждён что ЛЮБЫЕ соединения между сигналами разных типов невозможны. Оказалось, что
connect(ui.lineEdit, SIGNAL(textChanged( const QString & )), mapper, SLOT(map())); отлично работает!.. Проблема решена и спасибо всем откликнувшимся!
Записан
KOSchMAR
Гость
« Ответ #7 : Июль 16, 2005, 13:15 »

Соединяемые сигналы и слоты должны иметь идентичные сигнатуры (т.е. количество и типы входных аргументов):
connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),
        this, SLOT(processReply(int, const QString &)));

Исключение составляет случай, когда сигнал имеет большее число аргументов, чем слот. В этом случае "лишние" аргументы просто не передаются в слот. (это из  книги Бланшете "Разработка графического интерфейса с помощью библиотеки Qt3" глава 2.2)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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