2012-05-30 1 views
0

Si QtCreator est défini par défaut lorsque vous créez un widget, la classe correspondante crée le formulaire comme étant privé de la classe. Donc, vous avez par exemple quelque chose comme ceci:Connexion aux signaux de widgets privés

Maintenant ce que je veux savoir comment vous connecter aux signaux dans le ui. Par exemple, si ce widget a été intégré dans un QStackedWidget et que vous appuyez sur un bouton, la page affichée doit être modifiée. J'aurais envisagé de me connecter au bouton mais ui est privé donc je ne peux pas.

Est-ce que je dois créer des signaux dans MainWindow et ensuite, à l'intérieur de ce lien, le 'ui' leur envoie un signal et donc la hiérarchie? Ou ai-je manqué quelque chose de simple?

Répondre

3

Vous ne pouvez pas connecter un objet indépendant aux signaux/emplacements des composants agrégés, même si vous le pouvez, cela pourrait rompre l'encapsulation et devenir un cauchemar de maintenance.

Vous devez exposer les signaux/emplacements des composants d'agrégat en les ajoutant à l'API MainWindow, puis appeler la méthode de composant relative ui dans la définition.

Par exemple, dans la définition MainWindow, ajouter:

signals: 
    void buttonClicked(); 

Et puis dans le constructeur, faites:

connect(ui->button, SIGNAL(clicked()), this, SIGNAL(buttonClicked())); 

De cette façon, votre MainWindow classe propage des signaux à partir de son agrégats - mais réglé finement à exactement comment vous avez l'intention de la classe à utiliser.

+0

Merci pour la réponse. J'avais compris que ce serait un cauchemar à maintenir, c'est pourquoi j'essaie de bien faire les choses, donc j'apprends les meilleurs processus :-) Donc, si je vous ai bien compris, ce que vous voulez dire, c'est que dans mon agrégat je aurait besoin de créer des signaux qui représentent, disons, le clic de bouton, puis mon 'MainWindow 'se connecterait à ce signal alors dans le composant aggreagate son juste un cas de connexion des signaux ensemble? – Firedragon

+0

@Firedragon J'ai modifié ma réponse pour ajouter un exemple. Pour les slots, ajoutez votre slot à l'en-tête, puis dans sa définition appelez directement le composant agrégé (vous ne pouvez pas enchaîner les slots dans un appel 'connect()'). – cmannett85

+0

Merci beaucoup. C'est beaucoup plus clair maintenant pour moi – Firedragon

Questions connexes