LINUX.ORG.RU

ООП в Qt, посылка сигнала или события неизвестному получателю


0

1

Собственно не хочется в каждый объект передавать указатели на остальные (вызов методов, посылка сигналов и тп). Чтобы посылать теже QEvent нужен указатель на приемник, встроенными средствами Qt как я понимаю нельзя «зарегистрировать» объект как обработчик некоторого QEvent, нужен спец. класс типа QAppBus который бы разруливал все связи объектов, может кто встречал что-то подобное (несистемное)?


Ответ на: комментарий от pulo

ну так и вызывай connect в третьем объекте. В результате не sender не receiver друг о друге знать не будут.

AF ★★★
()

Ты, очевидно, не понимаешь сути слотов и сигналов.

Объект, посылающий сигнал, не посылает его кому-то конкретно, он посылает его _вообще_. Даже, если никто не присоединён.

Объект, имеющий слот, в общем случае не знает, кто его вызвал (чей сигнал). Ему это и не надо. Всё, что надо, пришло в параметрах слота.

Так спроектировано изначально. Ты перемудрил. Всем коннектам де-факто и положено находиться вне объектов соединяемых, как AF и пишет.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Тогда получается, что модульно приложение сложно сделать, те объект сам не может зарегистрироваться на конкретные ресурсы, нужно править объект «линкер» чтобы присоединить его к остальным, либо делать интерфейс и передавать всем указатель на линкера:)

pulo
() автор топика
Ответ на: комментарий от pulo

sender/receiver может совпадать с this. В чем проблема то?

Определись, что тебе надо и не морочь людям голову

AF ★★★
()
Ответ на: комментарий от AF

При чем тут this вообще?

Хочется сделать приложение гибким и расширяемым с помощью плагинов или просто .so'шек, при этом новые объекты могли сами использовать и предоставлять ресурсы другим.

pulo
() автор топика
Ответ на: комментарий от pulo

Перед этим нужно сделать connect(sender, SIGNAL(), receiver, SLOT());

конечно нет

shty ★★★★★
()
Ответ на: комментарий от false

Тему то читал вообще?:-D Как объект новый к остальным коннектить то? Нельзя просто послать сигнал или event, нужно к приемнику привязывать. В приемнике аналогично, нельзя сказать, обрабатываю такие event и сигналы, а от кого - неважно. Потому приходится сторонний интерфейс городить через который можно сказать к кому приконнектили чтобы.

pulo
() автор топика
Ответ на: комментарий от shty

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

pulo
() автор топика
Ответ на: комментарий от pulo

Перед этим нужно сделать connect(sender, SIGNAL(), receiver, SLOT());

соединить сигнал со слотом можно практически в любом месте в коде.

HerrWeigel ★★★★
()
Ответ на: комментарий от shty

Есть работающие объекты, следят за разными вещами, обмен через сигналы и события, подключаем новую сошку и новый объект есть, его нужно в систему подключить, для этого нужно искать с кем его соединять, искал способ без явного вызова соединения отправитель-получатель. Походу в Qt такого нет.

pulo
() автор топика
Ответ на: комментарий от pulo

Пойди поспи чтоль. С утра глядишь и легче станет. А то вообще непонятно, чего ты городить собрался.

false ★★★★★
()

У меня, помнится, было реализовано через eventFilter. Имелся один глобальный объект, видимый всем остальным объектам. Объекты, которым требовалось «слушать» некоторое событие, делали installEventFilter(). Объекты - «генераторы» событий, делали sendEvent/postEvent. Тем самым, источники и получатели событий друг друга не знали.

XyAH
()
Ответ на: комментарий от XyAH

Да по типу такого и надо, единственное рассылка широковещательной получается, хотя думаю не проблема.

pulo
() автор топика
Ответ на: комментарий от pulo

Сигнатура у сигналов и слотов вообще в рантайме определяется и типизация там утиная, то есть connect'у вообще пофиг что ты ежа с ужом соединяешь или осла с енотом. Ему главное, чтобы у sender'а был сигнал с определенной сигнатурой, а у reciever'ов слоты с нужной сигнатурой

Gorthauer ★★★★★
()
Ответ на: комментарий от XyAH

Можно послать событие в QApplication и на QApplication повесить eventFilter, но это кривое решение ибо фильтр слишком много событий будет ловить

Gorthauer ★★★★★
()
Ответ на: комментарий от pulo

У тебя QApplication это QObject, ему ты можешь отослать событие, а также установить фильтр событий и в итоге через эту шину обмениваться сообщениями как угодно. Или же лучше тогда сделать свой глобальный QObject, чтобы системные события не слушать в фильтре и его использовать как шину сообщений

Gorthauer ★★★★★
()
Ответ на: комментарий от pulo

In Qt, events are objects, derived from the abstract QEvent class...

отсюда

короче, гуглить subclassing qevent или qt user defined events

shty ★★★★★
()
Ответ на: комментарий от pulo

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

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

те объект сам не может зарегистрироваться на конкретные ресурсы, нужно править объект «линкер» чтобы присоединить его к остальным, либо делать интерфейс и передавать всем указатель на линкера:)

Ахинея.

У тебя будет набор объектов, не связанных между собой. Для связи друг с другом и используются сигналы и слоты. В любом месте твоей программмы ты их связываешь друг с другом. Вовне этих объектов. Объекты по прежнему не знают друг о друге. Они просто посылают и принимают сигналы.

Это же азы. Ты либо не понял Qt (или вообще ООП), либо невнятно объяснил, что хочешь.

schizoid ★★★
()
Ответ на: комментарий от Gorthauer

Всем спасибо, скорее всего так и сделаю.

pulo
() автор топика
Ответ на: комментарий от XyAH

Да, но можно это в любой момент делать не зная типа объекта.

Gorthauer ★★★★★
()

вопрос, вообще говоря, фундаментальный - о модели событий, не имеющей статической схемы коммутации. такая модель поддерживается (например) в Tcl и в Erlang; варианты эмуляции в C++/Qt уже, вроде, предложили,- однако естественной для Qt (да и для любой другой реализации сигналов/слотов) эта модель не является

jtootf ★★★★★
()
Ответ на: комментарий от KblCb

Я не понял что он хотел

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Любопытно, хотя пока в толк не возьму где это могло быть нужно. Что-то подобное я реализовывал на общей памяти для сообщения между запущенными приложениями, но там в этом хотя бы смысл был. А как это сделано в Tcl и Erlang?

KblCb ★★★★★
()

Чтобы посылать теже QEvent нужен указатель на приемник, встроенными средствами Qt как я понимаю нельзя «зарегистрировать» объект как обработчик некоторого QEvent

Можно обойти всю иерархию QObject от известной вершины и отправить всем свой кастомный QEvent. Кто его понимает - обработает, остальным пофиг.

annulen ★★★★★
()
Ответ на: комментарий от KblCb

Хочется сделать систему так, чтобы модулями(плагинами) можно было функционал наращивать без изменения основы, те коллега или вообще незнакомый человек пишет модули и просто подключает их в систему.

pulo
() автор топика
Ответ на: комментарий от pulo

Эм… Я делал так и не раз. Но для этого вполне хватает хороших интерфейсов, реализуемых плагинами.

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Да, можно сделать и через интерфейсы, думаю, если бы был такой механизм событий сделать было проще, добавил новый модуль со своими событиями, которые знает только другой новый модуль, а как они друг с другом взаимодействуют уже неважно. Так калькулятор превращается в плеер...

pulo
() автор топика
Ответ на: комментарий от pulo

Вообще-то такой механизм есть. Он называется глобальная петля событий. Любое событие запощенное в любой части приложения дойдёт до любого его модуля, если не будет перехвачено раньше.

KblCb ★★★★★
()

Похоже ты говоришь про аналог blackboard (описан, например, в Pragmatic Programmer, A. Hunt). В Qt такого нет, но легко реализовать через QMetaObject::invokeMethod() и object->metaObject()->className().

unfo ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.