![]() |
|
![]() ![]() ![]() |
|
iigor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
заранее извиняюсь, если не в тот раздел, просто здесь я нашёл руководство по qt4, которое мне очень помогло...
вопрос: как узнать, кто послал сигнал в слот? или как создать свой сигнал наиболее просто, например у тестового поля (QLineEdit) проблема такая: есть много полей qlineedit, есть слот, который что-то делает, когда в поле нажимают enter, но то, что он делает, завит от того, из какого поля пришёл сигнал. пример: есть slot Aslot(). есть два объекта QLineEdit edit1, edit2 (создаются они НЕ вручную!) у них есть стандартный сигнал void returnPressed () я вижу 2 пути. первый: из Aslot узнать, кто хозяин сигнала, изъять значение поля и дальше уже с ними работать. (далее первый вопрос выше.) второй: сделать slot Bslot(QWidget* sender) тогда нужно как-то сделать ещё один сигнал. (далее встаёт второй вопрос.) если идти по пути расширения QLineEdit, то я так понимаю, придётся окошки прорисовывать руками, что оооочень не хочется |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
я вижу решение во введение дополнительного параметра в слот-метод, содержащее указатель на вызывающий объект. QWidget*, например. Или более конкретный тип, чем QWidget. |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
Модератор: перенесено в программирование под никс
Хоть это и кроссплатформенная библиотека, но там больше всего тем по Qt. Я сейчас плохо осознаю действительность, не уверен, что понял вас. В С++ для работы с вызвавшим объектом всегда использовали указатель this.
emit создаёт сигнал. В общем всё так: реализуете свою функцию, она связывается с каким-то сигналом Qt, в ней создаёте свой с помощью emit. Наследуете от класса QLineEdit. Добавляете свой слот, изымаете содержимое с помощью this. Прорисовывать ничего не придётся. |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
что значит "кто" ?
вам нужно узнать какой класс послал или какой адрес у объекта ? -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: нет Всего: 58 |
Это еще зачем ? Спокойно делается потомок QMyLineEdit от QLineEdit и все. А если действительно надо перересовывать - перегружается соответствующая функция.............. |
|||
|
||||
iigor |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
перерисовывать в designer. там же слева не появятся нового моего элемента. в общем, как это сделать я не нашёл, пока.
мне нужен указатель на "класс-посылатель" сигнала, для того, чтобы обратиться к одному из его полей и идентифицировать посылателя.
да, если создавать QMyLineEdit, то можно создать свой сигнал с необходимыми параметрами. я хотел схалтурить и узнать указатель на пославший класс без передачи... оказалось, что это невозможно. КАК объяснить designer, что есть новый виджет QMyLineEdit ??? |
||||||
|
|||||||
powerfox |
|
||||||||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
Вам нужно сделать свой виджет, затем добавить его с помощью Qt Designer в форму. Это всё есть в главе про создание собственных виджетов книги Бланшет. Такое называется "promoute to custom widget".
Тут вопрос не только в Qt. Так же можно выдумывать, как узнать, откуда вызвали функцию (тоже самое, просто без скрытой реализации сигналов и слотов).
Я уже сказал, что нужно использовать this. Это С++ всё-таки. Выделяете ваш LineEdit, правый клик по нему, "Promoute to custom widget", пишете название своего класса и имя заголовка. Потом в реализации этого класса делаете всё, что захотите. Добавлено через 2 минуты и 53 секунды 1. Это больше походит на процедурное программирование. 2. Противоречит основной идеи сигналов и слотов. Она рассчитана на то, что слот знает, кто его вызывает (по-любому вручную надо соединять либо через коннект, либо в стиле JavaScript именовать слоты). Статический метод класса всегда может работать с вызвавшим его объектом через this, Qt лишь задаёт, каким образом вызывается метод. |
||||||||
|
|||||||||
iigor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
.
разве this указывает не на тот, класс в котором определён слот? |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
Класс и объект класса - разные вещи. this будет указывать на тот объект, который послал сигнал. Добавлено через 3 минуты и 48 секунд iigor, кстати, если тебе нужны просто поля класса, то, по идее, можно просто использовать имена полей класса. |
|||
|
||||
iigor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
тогда я очень много чего не понимаю
вот есть(там скорей всего много синтаксических ошибок, так что не пинайте, пишу по памяти.)
получается в зависимости от способа вызова sl() this будет указывать на a или на b. а если я захочу получить указатель а, мне что нужно будет сделать(раз this указывает на другой класс?) Это сообщение отредактировал(а) iigor - 8.9.2007, 19:31 |
|||
|
||||
Любитель |
|
||||||||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
this - это неявный "нулевой" параметр любого метода, т. е. указатель на объект, дял которого был вызван метод, т. е. (в данном случае) слот.
Вот reciever и будет this-ом. Как я понял, нужен указатель на объект заэмитивший сигнал (особо дискуссия не читал, правда). Для этого, как известно, есть метод sender у QObject (protected-метод). Добавлено через 1 минуту и 12 секунд
Опять таки - поля данного объекта, а не поля объекта, инициировавшего сигнал. Добавлено через 3 минуты и 42 секунды
Нет. Только: 1. У кутешного коннекта вначале идёт сендер + сигнал, затем - получатель + слот. 2. Сигнал просто объявляется - без тела. Важен факт его присутствия (moc сгенерит насколько я помню его как протектед-метод с телом, вызывающим все законнектенные слоты). 3. Какая-то муть с void* ![]() |
||||||||
|
|||||||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
Любитель, по первым сообщениям автора я понял, что у него есть несколько QLineEdit и он хочет по сигналу снимать оттуда данные. Про то, как работать с производным классом я и растолковывать
![]() Добавлено через 44 секунды А всё, что написал для этого абсолютно верно. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Первый пост я прочитал
![]() ![]() ![]() ![]() |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
Не понял ![]() Как ты добавишь слот к классу без наследования? |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
А зачем слот иметь обязательно в классе эдита/наследника эдита? В классе формочки (мэйнвиндоу, диалог и пр.), управляющий всем этим делом иметь слоты логичнее.
А вообще автору надо поподробней сказать задачу, чтобы можно было говорить о лучшем её решении... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |