На самом деле связи сигнал/слот проектируются продуманно.
По нашему мнению сигнал/слот надо использовать для обратных связей. То есть об'ектом управление идёт через вызовы обычных методов, а результат отдается через сигналы всем кто будет подписан на об'ект. Но вся фишка в том, что может быть подписан один, два получателя, а может и не одного.
Здесь сделана попытка графически представить взаимосвязь классов на одном небольшом примере.
Картинка из реального проекта, где показаны наследование классов, связи между классами.
бордовые стрелки - сигналы (это обратная связь)
черные стрелки - это прямые вызовы функций класса через указатель на этот класс.
kkt_QTabWgts - это QTabWidgets , набор закладок с соответствующими им виджетами оборудования (настройка связи с кассовым аппаратом).
QTabBar - закладки сверху.
В реальной программе выглядит примерно так:
В этой абракадабре стрелок есть логика. Смысл в том, что виджеты (они же об'екты) вложены один в другой (родитель/потомок).
Тут имеется ввиду не наследование, а так сказать композиция или агрегация.
Это когда потомок создаётся в коде родителя и указатель на потомка хранится в родителе.
Конечно потомок сигнал связывается со слотом родителя.
Так вот таких вложений может быть несколько. Но общее правило таково - нельзя при соединении сигналов и слотов перепрыгивать через родителя (или через потомка). Точнее не то чтобы нельзя , но не рекомендуется.
Если надо соединить дедушку с внуком, то папа должен быть в курсе. То есть делается два соединения дедушка/папа и папа/сын.
Потому что каждый потомок должен быть самодостаточен чтобы использоваться в других проектах без изменений.
Если же вы сделаете только соединение дедушка/внук, то папу нельзя будет полноценно использовать в других проектах (у него не будет нужного функционала).