Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] как узнать, кто послал сигнал в слот? 
:(
    Опции темы
iigor
Дата 7.9.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



заранее извиняюсь, если не в тот раздел, просто здесь я нашёл руководство по qt4, которое мне очень помогло...


вопрос:
как узнать, кто послал сигнал в слот?
или как создать свой сигнал наиболее просто, например у тестового поля (QLineEdit)

проблема такая:
есть много полей qlineedit, есть слот, который что-то делает, когда в поле нажимают enter, но то, что он делает, завит от того, из какого поля пришёл сигнал.

пример:
есть slot Aslot().
есть два объекта QLineEdit edit1, edit2 (создаются они НЕ вручную!)
у них есть стандартный сигнал 
void returnPressed ()

я вижу 2 пути. 
первый:
из Aslot узнать, кто хозяин сигнала, изъять значение поля и дальше уже с ними работать.
(далее первый вопрос выше.)

второй:
сделать slot Bslot(QWidget* sender)
тогда нужно как-то сделать ещё один сигнал.
(далее встаёт второй вопрос.)


если идти по пути расширения QLineEdit, то я так понимаю, придётся окошки прорисовывать руками, что оооочень не хочется
PM MAIL   Вверх
JackYF
Дата 7.9.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(iigor @  7.9.2007,  20:10 Найти цитируемый пост)
как узнать, кто послал сигнал в слот?

я вижу решение во введение дополнительного параметра в слот-метод, содержащее указатель на вызывающий объект. QWidget*, например.
Или более конкретный тип, чем QWidget.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
powerfox
Дата 7.9.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



Модератор: перенесено в программирование под никс
Хоть это и кроссплатформенная библиотека, но там больше всего тем по Qt.

Я сейчас плохо осознаю действительность, не уверен, что понял вас. В С++ для работы с вызвавшим объектом всегда использовали указатель this.

Цитата(iigor @  7.9.2007,  21:10 Найти цитируемый пост)
или как создать свой сигнал наиболее просто, например у тестового поля (QLineEdit)

emit создаёт сигнал. В общем всё так: реализуете свою функцию, она связывается с каким-то сигналом Qt, в ней создаёте свой с помощью emit.



Цитата(iigor @  7.9.2007,  21:10 Найти цитируемый пост)
у них есть стандартный сигнал 
void returnPressed ()

я вижу 2 пути. 
первый:
из Aslot узнать, кто хозяин сигнала, изъять значение поля и дальше уже с ними работать.
(далее первый вопрос выше.)


Наследуете от класса QLineEdit. Добавляете свой слот, изымаете содержимое с помощью this. Прорисовывать ничего не придётся.


--------------------
user posted image
PM WWW   Вверх
bilbobagginz
Дата 8.9.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



что значит "кто" ?
вам нужно узнать какой класс послал или какой адрес у объекта ?




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
GrayCardinal
Дата 8.9.2007, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: нет
Всего: 58



Цитата

если идти по пути расширения QLineEdit, то я так понимаю, придётся окошки прорисовывать руками, что оооочень не хочется 

Это еще зачем ? Спокойно делается потомок QMyLineEdit от QLineEdit и все. А если действительно надо перересовывать - перегружается соответствующая функция..............


--------------------
PM MAIL WWW   Вверх
iigor
Дата 8.9.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



Цитата

Это еще зачем ? Спокойно делается потомок QMyLineEdit от QLineEdit и все. А если действительно надо перересовывать - перегружается соответствующая функция..............

перерисовывать в designer. там же слева не появятся нового моего элемента. в общем, как это сделать я не нашёл, пока.


Цитата

вам нужно узнать какой класс послал или какой адрес у объекта ?

мне нужен указатель на "класс-посылатель" сигнала, для того, чтобы обратиться к одному из его полей и идентифицировать посылателя.




Цитата

я вижу решение во введение дополнительного параметра в слот-метод,

да, если создавать QMyLineEdit, то можно создать свой сигнал с необходимыми параметрами.
я хотел схалтурить и узнать указатель на пославший класс без передачи... оказалось, что это невозможно.


КАК объяснить designer, что есть новый виджет QMyLineEdit ???
PM MAIL   Вверх
powerfox
Дата 8.9.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



Цитата(iigor @  8.9.2007,  13:28 Найти цитируемый пост)
перерисовывать в designer. там же слева не появятся нового моего элемента. в общем, как это сделать я не нашёл, пока.

Вам нужно сделать свой виджет, затем добавить его с помощью Qt Designer в форму. Это всё есть в главе про создание собственных виджетов книги Бланшет.
Такое называется "promoute to custom widget".

Цитата(iigor @  8.9.2007,  13:28 Найти цитируемый пост)
мне нужен указатель на "класс-посылатель" сигнала, для того, чтобы обратиться к одному из его полей и идентифицировать посылателя.


Тут вопрос не только в Qt. Так же можно выдумывать, как узнать, откуда вызвали функцию (тоже самое, просто без скрытой реализации сигналов и слотов).

Цитата(iigor @  8.9.2007,  13:28 Найти цитируемый пост)
мне нужен указатель на "класс-посылатель" сигнала, для того, чтобы обратиться к одному из его полей и идентифицировать посылателя.

Цитата(iigor @  8.9.2007,  13:28 Найти цитируемый пост)
я хотел схалтурить и узнать указатель на пославший класс без передачи... оказалось, что это невозможно.

Я уже сказал, что нужно использовать this. Это С++ всё-таки.

Цитата(iigor @  8.9.2007,  13:28 Найти цитируемый пост)
КАК объяснить designer, что есть новый виджет QMyLineEdit ??? 

Выделяете ваш LineEdit, правый клик по нему, "Promoute to custom widget", пишете название своего класса и имя заголовка. Потом в реализации этого класса делаете всё, что захотите.

Добавлено через 2 минуты и 53 секунды
Цитата(JackYF @  7.9.2007,  21:22 Найти цитируемый пост)
я вижу решение во введение дополнительного параметра в слот-метод, содержащее указатель на вызывающий объект. QWidget*, например.
Или более конкретный тип, чем QWidget.

1. Это больше походит на процедурное программирование.
2. Противоречит основной идеи сигналов и слотов. Она рассчитана на то, что слот знает, кто его вызывает (по-любому вручную надо соединять либо через коннект, либо в стиле JavaScript именовать слоты). Статический метод класса всегда может работать с вызвавшим его объектом через this, Qt лишь задаёт, каким образом вызывается метод.



--------------------
user posted image
PM WWW   Вверх
iigor
Дата 8.9.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



.
Цитата

Я уже сказал, что нужно использовать this.

разве this указывает не на тот, класс в котором определён слот?
PM MAIL   Вверх
powerfox
Дата 8.9.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



Цитата(iigor @  8.9.2007,  19:36 Найти цитируемый пост)
разве this указывает не на тот, класс в котором определён слот? 

Класс и объект класса - разные вещи. this будет указывать на тот объект, который послал сигнал.

Добавлено через 3 минуты и 48 секунд
iigor, кстати, если тебе нужны просто поля класса, то, по идее, можно просто использовать имена полей класса.


--------------------
user posted image
PM WWW   Вверх
iigor
Дата 8.9.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



тогда я очень много чего не понимаю



вот есть(там скорей всего много синтаксических ошибок, так что не пинайте, пишу по памяти.)
Код



class A {
public slot:
void sl() {
 void *d;
 d = (void*) this;
 }
}

class B {
signals:
void sig() {
 
 }
}

main() {
 A *a;
 B *b;
 a = new A();
 b = new B();
 a->sl(); 

 connect (a,SLOT(sl()),b,SIGNAL(sig()));
}


получается в зависимости от способа вызова sl() this будет указывать на a или на b.

а если я захочу получить указатель а, мне что нужно будет сделать(раз this указывает на другой класс?)



Это сообщение отредактировал(а) iigor - 8.9.2007, 19:31
PM MAIL   Вверх
Любитель
Дата 8.9.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(powerfox @  8.9.2007,  18:59 Найти цитируемый пост)
Класс и объект класса - разные вещи. this будет указывать на тот объект, который послал сигнал.

this - это неявный "нулевой" параметр любого метода, т. е. указатель на объект, дял которого был вызван метод, т. е. (в данном случае) слот.

Код

connect(sender, SIGNAL(someSignal()), reciever, SLOT(someSlot()));


Вот reciever и будет this-ом. Как я понял, нужен указатель на объект заэмитивший сигнал (особо дискуссия не читал, правда). Для этого, как известно, есть метод sender у QObject (protected-метод).

Добавлено через 1 минуту и 12 секунд
Цитата(powerfox @  8.9.2007,  18:59 Найти цитируемый пост)
iigor, кстати, если тебе нужны просто поля класса, то, по идее, можно просто использовать имена полей класса

Опять таки - поля данного объекта, а не поля объекта, инициировавшего сигнал.

Добавлено через 3 минуты и 42 секунды
Цитата(iigor @  8.9.2007,  19:30 Найти цитируемый пост)
получается в зависимости от способа вызова sl() this будет указывать на a или на b.

Нет. Только:
1. У кутешного коннекта вначале идёт сендер + сигнал, затем - получатель + слот.
2. Сигнал просто объявляется - без тела. Важен факт его присутствия (moc сгенерит насколько я помню его как протектед-метод с телом, вызывающим все законнектенные слоты).
3. Какая-то муть с void* smile


--------------------
PM MAIL ICQ Skype   Вверх
powerfox
Дата 8.9.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



Любитель, по первым сообщениям автора я понял, что у него есть несколько QLineEdit и он хочет по сигналу снимать оттуда данные. Про то, как работать с производным классом я и растолковывать smile

Добавлено через 44 секунды
А всё, что написал для этого абсолютно верно.


--------------------
user posted image
PM WWW   Вверх
Любитель
Дата 8.9.2007, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Первый пост я прочитал smile Создавать свой класс для такого дела на мой взгляд не нужно. Лучший вариант, на мой взгляд, просто иметь два слота  smile Возможно обращающиеся к одному методы, если функциональность похожая. А делать один мегаслот  smile на все случаи жизни, а затем юзать всякие sender - совсем не гуд smile Аналогично злоупотреблению РТТИ на самом деле.


--------------------
PM MAIL ICQ Skype   Вверх
powerfox
Дата 8.9.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



Цитата(Любитель @  8.9.2007,  21:52 Найти цитируемый пост)
Создавать свой класс для такого дела на мой взгляд не нужно. Лучший вариант, на мой взгляд, просто иметь два слота  smile Возможно обращающиеся к одному методы, если функциональность похожая. А делать один мегаслот  smile на все случаи жизни, а затем юзать всякие sender - совсем не гуд smile Аналогично злоупотреблению РТТИ на самом деле. 

Не понял smile

Как ты добавишь слот к классу без наследования?


--------------------
user posted image
PM WWW   Вверх
Любитель
Дата 8.9.2007, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



А зачем слот иметь обязательно в классе эдита/наследника эдита? В классе формочки (мэйнвиндоу, диалог и пр.), управляющий всем этим делом иметь слоты логичнее.

А вообще автору надо поподробней сказать задачу, чтобы можно было говорить о лучшем её решении...


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.