Russian Qt Forum

Qt => Общие вопросы => Тема начата: ElderOrb от Июль 15, 2005, 14:29



Название: Изменение типа сигнала
Отправлено: 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 для группы радиобуттонов имеют разные параметры, и "красиво" использовать сигналмэппер не получится.

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


Название: Re: Изменение типа сигнала
Отправлено: Zmey от Июль 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 от Июль 15, 2005, 16:36
Чего-то в этом духе мне и хотелось бы добиться... Но вот как? Не могу же я подключить сигнал одного типа к сигналу другого?.. Или могу?


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


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

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

connect(lineEdit, SIGNAL(textChanged(const QString &)),
        this, SIGNAL(updateRecord(const QString &)));            
           
Когда посылается первый сигнал, то вслед за ним подается и второй. С точки зрения программы, соединение типа сигнал-сигнал ничем не отличается от соединения типа сигнал-слот."


Название: Изменение типа сигнала
Отправлено: ElderOrb от Июль 15, 2005, 17:01
Проблема в том что в моём случае сигналы разных типов... А насколько я знаю подключения вида
connect(sender, SIGNAL(senderSignal(const QString& )),
receiver, SLOT(receiverSlot(in))) , (т.е. подключения между сигналами разных типов) невозможны.


Название: Изменение типа сигнала
Отправлено: KOSchMAR от Июль 15, 2005, 23:46
если с потерей информации, то что мешает использовать SLOT(MyVoidSlot())?


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


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

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