Поиск исходного отправителя перенаправленного сигнала QT

Моя установка: у меня есть один класс, который только излучает сигналы, называемый классом Conn.

Все мои классы QObject (A, B и C) существуют изолированно, и я не хочу, чтобы они вообще знали друг о друге. Однако, если класс A хочет отправить некоторую информацию за пределы себя, он должен отправить сигнал объекту Conn.

Класс B и C имеют доступ к объекту Conn и могут сами решить, хотят ли они прослушивать один из сигналов Conn.

Моя проблема: допустим, класс A хочет передать сигнал в объекте Conn с именем sig_updateFoo(int) всякий раз, когда он обновляет foo. Теперь предположим, что класс A также хочет подключить сигнал sig_updateFoo(int) к своему слоту с именем slot_FooUpdated(int), потому что он также хочет прослушивать, когда кто-то еще испускает сигнал Сигнал объекта Conn.

Логическая ошибка возникает, когда объект Conn класса A испускает сигнал, который также подключен к одному из его слотов.

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

Идеи, которые я пробовал: Если я использую QObject::sender() в слоте класса A, я получаю ссылку только на объект Conn, а не на класс A.

Любые идеи?


person John-Luke Laue    schedule 05.03.2015    source источник


Ответы (1)


В общем, вам нужно будет передать некоторую форму идентификатора с каждым излучением сигнала. Единственная функциональность, которую Qt предлагает вам в этом отношении, — это sender(), но, как вы уже выяснили, она возвращает только последнего отправителя (что неудивительно).

Однако в этом сценарии не будет ли проще просто сравнить значение, полученное slot_FooUpdated(int), с последним значением, отправленным объекту Conn, и действовать только в том случае, если значения различаются?

person cmannett85    schedule 05.03.2015
comment
Блин, я так и подозревал. Класс A и класс B могут отправлять одно и то же значение одновременно. Они полностью независимы друг от друга. Если бы я только сравнил значение, я мог бы выбросить значение из класса B. Поскольку они являются одним и тем же значением, я думаю, это не имело бы большого значения, но я надеялся на более элегантное решение. Спасибо за помощь. - person John-Luke Laue; 05.03.2015