Как транслировать сигнал в Qt4 - PullRequest
3 голосов
/ 20 июля 2010

Мне нужна парадигма в программе Qt4 (PyQt4), где компонент может реагировать на сигнал, ничего не зная о том, откуда он исходит.

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

По сравнению с другими наборами инструментов, например, в wxWidgets я бы использовал события.Они автоматически распространяются от дочерних окон / объектов к родителям.На каждом уровне они могут быть обработаны.Это означает, что если у меня много детей, которые могут генерировать одно и то же событие, мне не нужно явно подключать их всех к обработчику.Я могу просто поместить обработчик в родительский или какой-то более высокий уровень в иерархии окон.Это означает, что только генератор событий и потребитель должны знать о событии вообще.Потребителю не нужно знать, где находится источник события, сколько таких источников или что-либо еще об этом.

Возможно ли это в Qt - есть ли другой подход?Может быть, есть альтернативный механизм событий для сигналов и слотов?

Ответы [ 3 ]

1 голос
/ 20 июля 2010

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

0 голосов
/ 10 декабря 2011

Обработчики сигналов НЕ знают эмиттер (только тип сигнала), а эмиттеры НЕ знают, какие обработчики подключены. Многие обработчики могут подключаться к одному и тому же сигналу, и они выполняются в порядке подключения. Сигнал может быть излучен из разных мест.

0 голосов
/ 21 июля 2010

Разве вам не нужен старый добрый вызов метода? Ответ - это просто возвращаемое значение метода.

...