Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / connect(): слоты и сигналы / 25 сообщений из 130, страница 1 из 6
11.09.2020, 17:25
    #39997725
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
На примере Qt, но его тут знать не обязательно. Вот сигнатура, упрощённо:

Код: plaintext
1.
void QObject::connect(const QObject *sender, const char *signal, const char *method) const;


Не обращайте внимание, что сигналы и слоты типа "const char *" это устаревшее, но не суть.

Мы наследуемся от QObject, вызываем этот метод. Далее объект "sender" генерирует сигнал "signal" и для "this" вызывается "method".

Обратите внимание, что в вызов connect() не передаётся this. Откуда ж он его знает? :) Я думаю, что там где-то кодогенерация с виртуальными функциями. Ну или макрос Q_OBJECT определяет виртуальную функцию, которая возвращает this.

Вроде по другому задачу не решить? Я так просто порассуждать.
...
Рейтинг: 0 / 0
11.09.2020, 17:38
    #39997730
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav
Обратите внимание, что в вызов connect() не передаётся this. Откуда ж он его знает? :)

Как это не передается. Это же не статический метод, значит this у него есть.
...
Рейтинг: 0 / 0
11.09.2020, 17:41
    #39997733
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
Прочитай основы ОО в С++: каждый нестатический метод класса имеет скрытый параметр. И это
- тадам! - this.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.09.2020, 18:04
    #39997745
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
Anatoly Moskovsky
petrav
Обратите внимание, что в вызов connect() не передаётся this. Откуда ж он его знает? :)

Как это не передается. Это же не статический метод, значит this у него есть.

Да, только в connect() this будет указывать на QObject, а метод-слот нужно будет вызвать в наследнике. И наследников может быть несколько: QObject -> A -> B. Множественное наследование тоже не запрещено.
...
Рейтинг: 0 / 0
11.09.2020, 18:09
    #39997748
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav, а исходники Qt почитать и, заодно, посмотреть что именно moc генерит что мешает? Пройтись дебаггером, в конце концов? )) там муторно конечно, но разобраться можно
...
Рейтинг: 0 / 0
11.09.2020, 18:10
    #39997749
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav,

Метод который вызывается виртуальный. Дальше все автоматически происходит.
...
Рейтинг: 0 / 0
11.09.2020, 18:12
    #39997752
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav
Anatoly Moskovsky
пропущено...

Как это не передается. Это же не статический метод, значит this у него есть.

Да, только в connect() this будет указывать на QObject
С чего это??? this показывает на конкретный объект а не на класс. А уж сколько там уровней наследования никакой роли не играет.
...
Рейтинг: 0 / 0
11.09.2020, 18:13
    #39997753
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
Anatoly Moskovsky
petrav,

Метод который вызывается виртуальный. Дальше все автоматически происходит.

Метод-слот, который вызывается, не виртуальный. И в QObject его вообще нет ни в каком виде.

На то он и слот...
...
Рейтинг: 0 / 0
11.09.2020, 18:29
    #39997761
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav,

морочишь людям головы.
Код: plaintext
1.
2.
template <typename PointerToMemberFunction, typename Functor>
QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

если в функции три параметра то третий это функтор и туда будут приходить сигналы. но никак не в объект в котором ты вызываешь connect
...
Рейтинг: 0 / 0
11.09.2020, 18:33
    #39997763
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
OoCc
petrav,

морочишь людям головы.
Код: plaintext
1.
2.
template <typename PointerToMemberFunction, typename Functor>
QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

если в функции три параметра то третий это функтор и туда будут приходить сигналы. но никак не в объект в котором ты вызываешь connect

Это новшество Qt 5. Если вы посмотрите на сигнатуру в первом посте, то поймёте, что вопрос был про функцию connect() из Qt 4.

PS: Да, я не пользуюсь этой устаревшей функцией, всё только compile time, без char * хранящий инфу о слоте.
...
Рейтинг: 0 / 0
11.09.2020, 18:45
    #39997768
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav
OoCc
petrav,

морочишь людям головы.
Код: plaintext
1.
2.
template <typename PointerToMemberFunction, typename Functor>
QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

если в функции три параметра то третий это функтор и туда будут приходить сигналы. но никак не в объект в котором ты вызываешь connect

Это новшество Qt 5. Если вы посмотрите на сигнатуру в первом посте, то поймёте, что вопрос был про функцию connect() из Qt 4.

PS: Да, я не пользуюсь этой устаревшей функцией, всё только compile time, без char * хранящий инфу о слоте.

В таком случае Qt генерирует что то. Метод же обьявляется как слот.
...
Рейтинг: 0 / 0
12.09.2020, 21:24
    #39997988
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
Кстати, а какие у нас вообще есть честные C++ способы передать this наследника в
базовый класс (кроме виртуальных функций)?

- Через "странно рекурсивное наследование" передать в базовый класс тип (класс)
наследника. И в базовом классе преобразовать this базового класса.

- Паттерн Command. Самая простая реализация std::function + std::bind.

- Передать в базовый класс функтор (лямбду) в котором упакованы this (ну и метод).

Перечисленное во многом пересекается, в терминологии могу ошибаться.

Что-то забыл?
...
Рейтинг: 0 / 0
13.09.2020, 10:00
    #39998034
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav,
Опять же нужен практический код и вопрос.
В общем случае базовый класс не должен знать о наследнике.
...
Рейтинг: 0 / 0
13.09.2020, 13:06
    #39998051
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav
Кстати, а какие у нас вообще есть честные C++ способы передать this наследника в
базовый класс (кроме виртуальных функций)?...


ОО метода это от жизни...
И посему интересн пример из жизни, где яйца должны знать форму лотка в котором они лежат. Это типо уши у них что ли появились или ручки для ощупывания?

выходит как то так...
(круглый)
ЗЫ
Для наследования - можно сказать по другому:
- сущность зверь знает кем она может быть в будущем? Типо через год буду зайцем... ????
ЗЫ ЗЫ
По поводу слотов в QT - там были глюки лет пять назад. Надо очень аккуратно коннект и дисконнект делать.
- сохранять форму вызова
- делать дисконнект в обратной последовательности
...
Рейтинг: 0 / 0
13.09.2020, 21:01
    #39998132
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
kolobok0
По поводу слотов в QT - там были глюки лет пять назад. Надо очень аккуратно коннект и дисконнект делать.
Не подскажите, где бы посмотреть про это (мне может оказаться актуальным)?
...
Рейтинг: 0 / 0
13.09.2020, 21:16
    #39998137
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
kolobok0
petrav
Кстати, а какие у нас вообще есть честные C++ способы передать this наследника в
базовый класс (кроме виртуальных функций)?...


ОО метода это от жизни...
И посему интересн пример из жизни, где яйца должны знать форму лотка в котором они лежат. Это типо уши у них что ли появились или ручки для ощупывания?

Иначе GUI в ООП стиле не построишь.
...
Рейтинг: 0 / 0
13.09.2020, 23:16
    #39998156
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav
.Иначе GUI в ООП стиле не построишь.




вот это поворот...
ну... тут надобно пример траблов, которые вызвали трудности...а так - не о чём...
накидайте пример. может я что то новое для себя узнаю...

(круглый)
...
Рейтинг: 0 / 0
14.09.2020, 05:56
    #39998176
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav
Иначе GUI в ООП стиле не построишь.
бездоказательно дорогой).
ООП это наследование, полиморфизм и инкапсуляция. Где трудности?
...
Рейтинг: 0 / 0
14.09.2020, 05:58
    #39998177
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
bk0010,
Вангую что утечка памяти. Но могу ошибаться.
Ну а прогеры старой закалки просто аккуратно подписываются и аккуратно отписываются на события.
...
Рейтинг: 0 / 0
14.09.2020, 10:23
    #39998215
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
kolobok0
petrav
.Иначе GUI в ООП стиле не построишь.




вот это поворот...
ну... тут надобно пример траблов, которые вызвали трудности...а так - не о чём...
накидайте пример. может я что то новое для себя узнаю...

Я думаю, что как-то так 22195969 и работает connect() из Qt 5.
Макрос "slots" уже не нужен.

Представьте, что мы разработчики Qt. Нам нужно без кодогенерации вызвать из
базовой библиотеки метод клиентского класса. При этом этот метод не виртуальный,
и не статический, имеет заведомо неизвестное название.
...
Рейтинг: 0 / 0
14.09.2020, 11:26
    #39998238
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
petrav, а сколько потоков в твоём приложении?
...
Рейтинг: 0 / 0
14.09.2020, 11:35
    #39998244
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
mayton
petrav, а сколько потоков в твоём приложении?

А к чему вопрос?
...
Рейтинг: 0 / 0
14.09.2020, 11:39
    #39998246
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
Я могу ошибаться но в моём понимании сигнально-слотная система полезна когда у тебя несколько
потоков коммуницируют друг с другом. Как акторы. Или как подписчики и поставщики в системах MQ.

В остальных случаях. Зачем? Ну вызови метод и все.
...
Рейтинг: 0 / 0
14.09.2020, 11:46
    #39998248
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
mayton
В остальных случаях. Зачем? Ну вызови метод и все.

Представим у нас есть два библиотечных класса BaseForm и PushButton.

Как вы предлагаете из них вызывать метод MyForm::onMyButtonPressed() ?

MyForm -- клиентский класс, наследник от BaseForm.
...
Рейтинг: 0 / 0
14.09.2020, 11:49
    #39998249
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect(): слоты и сигналы
Я так глубоко не вижу проблему. А в чем проблема вызвать метод?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / connect(): слоты и сигналы / 25 сообщений из 130, страница 1 из 6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]