Russian Qt Forum

Qt => Вопросы новичков => Тема начата: SlimSlot от Март 27, 2012, 15:47



Название: Определить от кого пришел сигнал
Отправлено: SlimSlot от Март 27, 2012, 15:47
Добрый день!

Подскажите, возможно ли определить от кого пришел сигнал - от пользователя или программно?
Т.е например, пользователь кликнул мышью по кнопке, либо я сигнал отослал данного клика.


Название: Re: Определить от кого пришел сигнал
Отправлено: Пантер от Март 27, 2012, 15:49
http://doc-snapshot.qt-project.org/4.8/qobject.html#sender


Название: Re: Определить от кого пришел сигнал
Отправлено: mutineer от Март 27, 2012, 15:51
вроде нельзя


Название: Re: Определить от кого пришел сигнал
Отправлено: Пантер от Март 27, 2012, 15:59
А, да, не так прочитал. Если сам кликаешь, то никак.


Название: Re: Определить от кого пришел сигнал
Отправлено: GreatSnake от Март 27, 2012, 17:01
Да можно всё.
Просто кое-что придётся самому сделать:
1. перегрузить QApplication::notify() и в нём следить за всеми кликами и хранить последний QWidget::winId() на котором нажали и время нажатия.
2. В слоте проверять текущий QWidget::winId() с сохранённым и дельту текущего времени с сохранённым.


Название: Re: Определить от кого пришел сигнал
Отправлено: SlimSlot от Март 27, 2012, 18:14
Да можно всё.
Просто кое-что придётся самому сделать:
1. перегрузить QApplication::notify() и в нём следить за всеми кликами и хранить последний QWidget::winId() на котором нажали и время нажатия.
2. В слоте проверять текущий QWidget::winId() с сохранённым и дельту текущего времени с сохранённым.

Да не, косо как-то по времени нажатия сверяться.

То что notify перегружать придется я предполагал, но что дальше не могу сообразить.

Плохо что нет. Но попробуем.




Название: Re: Определить от кого пришел сигнал
Отправлено: GreatSnake от Март 27, 2012, 18:24
Да не, косо как-то по времени нажатия сверяться.
И что в этом косого?


Название: Re: Определить от кого пришел сигнал
Отправлено: sudo от Март 27, 2012, 18:37
Может с кастомными сигналами сделать? Взять слот, к нему приконнектить сигнал от кнопки. Из слота отправлять свой сигнал с булевым значением. Если из него отправилось, то, например, с true, а если программно, то с false. Головняк, конечно, тот ещё получится, но будет работать. Или обязательно нужен штатный сигнал?


Название: Re: Определить от кого пришел сигнал
Отправлено: SlimSlot от Март 28, 2012, 13:09
Да не, косо как-то по времени нажатия сверяться.
И что в этом косого?

Кос не способ.
События на мой взгляд должны работать максимально быстро. А тут получается навешивание доп. функционала.
В любом случае по архитектуре это самое правильное.
Может с кастомными сигналами сделать? Взять слот, к нему приконнектить сигнал от кнопки. Из слота отправлять свой сигнал с булевым значением. Если из него отправилось, то, например, с true, а если программно, то с false. Головняк, конечно, тот ещё получится, но будет работать. Или обязательно нужен штатный сигнал?
Что-то типа перегрузки сигнала?


Название: Re: Определить от кого пришел сигнал
Отправлено: sudo от Март 28, 2012, 13:14
Типа такого. Если слот отработал как реакция на сигнал, тогда true отправится. Если слот вызвался напрямую, отправится false. А приёмник сигнала уже будет разбираться, что там пришло и в зависимости от параметра работать

Код
C++ (Qt)
connect(obj, SIGNAL(sg()), SLOT(sl()));
 
 
void Object::sl()
{
 emit mySignal(sender() ? true : false);
}
 
 


Название: Re: Определить от кого пришел сигнал
Отправлено: GreatSnake от Март 28, 2012, 13:31
События на мой взгляд должны работать максимально быстро. А тут получается навешивание доп. функционала.
На скорость такое "навешивание" никоим образом влиять не должно.


Название: Re: Определить от кого пришел сигнал
Отправлено: Igors от Март 28, 2012, 14:18
..либо я сигнал отослал данного клика.
Ну и зарядите флажок/переменную показывающую что это Вы послали.