Какова корректная спокойная идиома для представления сигналов/слотов содержавших виджетов?

Предположим, что у меня есть a MyWidget который содержит a MySubWidget, например, пользовательский виджет, который содержит текстовое поле или что-то. Я хочу, чтобы другие классы смогли соединиться с сигналами и слотами, выставленными содержавшим MySubWidget экземпляр. Стандартный путь состоит в том, чтобы сделать это:

  1. Выставьте указатель на MySubWidget экземпляр через a subWidget() метод в MyWidget
  2. Копируйте сигналы и слоты MySubWidget в MyWidget класс и "передающий" код записи
  3. Что-то еще?

Выбор 1 походит на наименьшее количество кода, но он также сортирует инкапсуляции повреждений, так как теперь другие классы знают что содержавшие виджеты MyWidget и мог бы стать зависящим от их функциональности.

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

Что обычно делается в этой ситуации?

19
задан Tyler McHenry 1 April 2010 в 00:17
поделиться

3 ответа

Если вы посмотрите на собственный код Qt, они предпочтут вариант 2.

Например, посмотрите QTabWidget и QTabBar . Они разделяют несколько сигналов и слотов, но QTabWidget скрывает тот факт, что он использует QTabBar (ну, вроде ... QTabWidget :: tabBar () явно нарушает это, хотя он и защищен).

Хотя это приведет к большему количеству кода, я думаю, что инкапсуляция того стоит.

Не забывайте, что вы можете соединять сигналы с сигналами следующим образом:

connect(mySubWidget, SIGNAL(internalSignal(int)), this, SIGNAL(externalSignal(int)));

Что заставит MyWidget испускать externalSignal (int) , когда MySubWidget испускает internalSignal (int) . По крайней мере, это помогает с сигнальной стороной дела. К сожалению, я не знаю простого способа сделать то же самое для слотов.

19
ответ дан 30 November 2019 в 04:52
поделиться

Я бы не беспокоился об инкапсуляции сигналов и слотов, предполагается, что только одна вещь делает соединение, так какой вред в том, что она знает о некоторых подклассах? Если вы работаете в большой команде, то предотвращение злоупотребления методом subWidget() является проблемой, но вы можете сделать это с помощью ключевого слова friend или чего-нибудь еще...

0
ответ дан 30 November 2019 в 04:52
поделиться

Можно предоставить базовый класс MySubWidget, содержащий меньше функциональных возможностей.

0
ответ дан 30 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: