2010-04-01 4 views
16

Supposons que j'ai un MyWidget qui contient un MySubWidget, par ex. un widget personnalisé qui contient un champ de texte ou quelque chose. Je veux que d'autres classes puissent se connecter aux signaux et aux slots exposés par l'instance MySubWidget contenue. La manière classique pour ce faire:Quel est l'idiome Qt correct pour exposer les signaux/emplacements des widgets contenus?

  1. Expose un pointeur vers l'instance MySubWidget par une méthode subWidget() dans MyWidget
  2. Dupliquer les signaux et les fentes de MySubWidget dans la classe MyWidget et écrire le code « Transfert »
  3. Autre chose?

Choix 1 semble que le moins le code, mais il a aussi casse sorte d'encapsulation, puisque maintenant d'autres classes savent ce que les widgets sont MyWidget confinées de et pourraient devenir dépendants de leur fonctionnalité.

Choix 2 semble garder l'encapsulation, mais c'est beaucoup de code apparemment redondant et potentiellement alambiqué qui bousille l'élégance de l'ensemble des signaux et des machines à sous.

Que fait-on normalement dans cette situation?

Répondre

16

Si vous regardez propre code de Qt, ils préfèrent l'option 2.

Par exemple, regardez QTabWidget et QTabBar. Ils partagent un certain nombre de signaux et de slots, mais QTabWidget cache le fait qu'il utilise un QTabBar (bien, sorta ... QTabWidget::tabBar() casse évidemment ceci même s'il est protégé).

Bien que cela se traduira par plus de code, je pense que ça vaut le coup pour l'encapsulation.

Ne pas oublier que vous pouvez connecter des signaux à des signaux comme ceci:

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

qui fera MyWidgetexternalSignal(int) quand MySubWidget émettent internalSignal(int) émet. Cela aide du moins le côté signal des choses. Je ne connais pas de moyen facile de faire la même chose pour les machines à sous, malheureusement.

+0

Je voudrais vous upvote deux fois si je pouvais pour cette connexion 'SIGNAL, SIGNAL'. Très utile! –

0

Je ne m'inquiéterais pas de l'encapsulation de signaux et de slots, il est probable qu'une seule chose est en train de faire la connexion, alors quel est le problème de connaître certaines sous-classes? Si vous travaillez sur une équipe plus grande prévention de l'abus de la méthode subWidget() est une préoccupation, mais vous pouvez le faire avec le mot-clé ami ou autre ...

0

Vous pourriez exposer une classe de base de MySubWidget qui contient moins de fonctionnalités.

Questions connexes