В частности, в ответ на возвращаемые значения я не чувствовал, что сигналы и слот Qt представляют собой хороший механизм возвратно-поступательного движения. Как уже упоминали другие, они очень хорошо работают в схеме / роли наблюдателя. Если вы подумаете об этом, есть потенциальные проблемы с возвращаемыми значениями ... например, что происходит, когда к сигналу подключено более одного слота, и каждый из них возвращает разные значения? Те же проблемы возникают в библиотеках SigC ++ и Boost :: Signals, где у каждой есть (разный?) Механизм для ее решения или, по крайней мере, выяснение того, что вы получите.
Если вам действительно нужно возвращаемое значение, я нашел два относительно хороших способа управления им. Первый - использовать механизм событий Qt для запроса данных, а затем передать запрошенные данные в ответ. Обратите внимание, что у событий нет встроенного способа выполнения ответов, поэтому вам потребуется расширить QEvent, чтобы иметь возможность обрабатывать этот случай. На самом деле, мы делаем это в приложениях на моей работе. Он хорошо работает для многопоточного приложения, когда вам нужен асинхронный механизм. Недостаток этого метода заключается в том, что запрашивающему необходимо знать об объекте, с которого он запрашивает данные (для отправки события). Отвечающий объект не должен знать больше, чем запрос и как отправить ответ, который обычно закодирован в запросе. Обратите внимание, что это почти противоположность модели наблюдателя.
Второй метод - передать объект функтора объекту, который должен иметь возможность запрашивать данные. Это работает намного лучше с хорошей библиотекой абстрактных функторов, которая позволяет инкапсулировать объекты и функции, такие как вышеупомянутые SigC ++ или Boost :: Signals. Это также хорошо работает в ситуациях, когда вам нужен немедленный ответ - вы запускаете оператор функтора, и он возвращает значение, прежде чем продолжить обработку в функции. Это также позволяет вам написать объект, похожий на тот, который вы сделали бы с механизмом сигнал / слот, где объект, которому нужно возвращаемое значение из функции (сигнал), не должен ничего знать о том, где был функтор (соединение сигнала) сделал или пришел. Он просто запускает функтор по мере необходимости.