Предположим, что у меня есть a MyWidget
который содержит a MySubWidget
, например, пользовательский виджет, который содержит текстовое поле или что-то. Я хочу, чтобы другие классы смогли соединиться с сигналами и слотами, выставленными содержавшим MySubWidget
экземпляр. Стандартный путь состоит в том, чтобы сделать это:
MySubWidget
экземпляр через a subWidget()
метод в MyWidget
MySubWidget
в MyWidget
класс и "передающий" код записиВыбор 1 походит на наименьшее количество кода, но он также сортирует инкапсуляции повреждений, так как теперь другие классы знают что содержавшие виджеты MyWidget
и мог бы стать зависящим от их функциональности.
Выбор 2 кажется, что это сохраняет инкапсуляцию, но это - много на вид избыточного и потенциально замысловатого кода такой, портит элегантность целой системы сигналов и слотов.
Что обычно делается в этой ситуации?
Если вы посмотрите на собственный код Qt, они предпочтут вариант 2.
Например, посмотрите QTabWidget и QTabBar . Они разделяют несколько сигналов и слотов, но QTabWidget скрывает тот факт, что он использует QTabBar (ну, вроде ... QTabWidget :: tabBar ()
явно нарушает это, хотя он и защищен).
Хотя это приведет к большему количеству кода, я думаю, что инкапсуляция того стоит.
Не забывайте, что вы можете соединять сигналы с сигналами следующим образом:
connect(mySubWidget, SIGNAL(internalSignal(int)), this, SIGNAL(externalSignal(int)));
Что заставит MyWidget
испускать externalSignal (int)
, когда MySubWidget
испускает internalSignal (int)
. По крайней мере, это помогает с сигнальной стороной дела. К сожалению, я не знаю простого способа сделать то же самое для слотов.
Я бы не беспокоился об инкапсуляции сигналов и слотов, предполагается, что только одна вещь делает соединение, так какой вред в том, что она знает о некоторых подклассах? Если вы работаете в большой команде, то предотвращение злоупотребления методом subWidget()
является проблемой, но вы можете сделать это с помощью ключевого слова friend или чего-нибудь еще...
Можно предоставить базовый класс MySubWidget, содержащий меньше функциональных возможностей.