Quels sont les signaux et les slots?
Quelqu'un peut m'expliquer en termes simples les "signaux et les slots" modèle?
source d'informationauteur JeffV
Vous devez vous connecter pour publier un commentaire.
Quelqu'un peut m'expliquer en termes simples les "signaux et les slots" modèle?
source d'informationauteur JeffV
Vous devez vous connecter pour publier un commentaire.
Les signaux et les slots sont un moyen de découplage de l'expéditeur (le signal) et de zéro ou plusieurs récepteurs (slots). Disons que vous avez un système qui a des événements que vous souhaitez rendre disponible de toute autre partie du système intéressés par ces événements. Plutôt que de le câblage le code qui génère l'événement pour le code qui veut savoir au sujet de ces événements, vous pouvez utiliser un des signaux et des slots modèle.
Lorsque l'expéditeur signaux d'un événement (généralement par l'appel de la fonction associée à l'événement/signaler) tous les récepteurs pour cet événement sont automatiquement appelé. Cela vous permet de vous connecter et de déconnecter les récepteurs que nécessaire au cours de la durée de vie du programme.
Depuis que cette question a été marqué C++, voici un lien vers le Coup de pouce.Les signaux bibliothèque qui a beaucoup une explication plus approfondie.
Je pense que l'on peut décrire les signaux et les slots mieux quand vous les regardez, comme une mise en œuvre possible du véhicule pour le Modèle observateur ou de la publication/l'Abonné Modèle. Il est l'un
signal
par exemplebuttonPressed(IdType)
sur l'Éditeur de Côté. Chaque fois que le bouton est enfoncé, toutes les machines à sous qui sont connectés à ce signal sont appelés. Les emplacements sont sur le Côté Abonné. Un logement peut être par exemplesendMail(IdType)
.Avec l'événement "touche enfoncée", le logement serait de savoir quel bouton a été pressé, car l'id aurait été remis.
IdType
représente le type de données envoyées sur le lien entre l'Éditeur et l'Abonné. Une opération possible pour l'Abonné seraitconnect(signal, slot)
qui pourrait se connecterbuttonPressed(IdType)
avecsendMail(IdType)
de sorte que si le bouton est enfoncé, ce slot est appelé.La bonne chose à ce sujet est que l'abonné (la fente de côté) n'a pas besoin de se soucier des détails du signal. Il a juste besoin de se connecter. Donc, ici, nous avons beaucoup de couplage lâche. Vous pouvez modifier les boutons de mise en œuvre, mais l'interface pour les slots serait toujours le même.
Regarder Qt Signaux/Slots ou Stimuler Les Signaux pour plus d'informations.
Imaginez avoir une interface graphique de votre application. La plupart du temps, le contrôle de flux n'est pas très linéaire, c'est à dire au lieu d'avoir une série d'actions que vous auriez un utilisateur qui interagit avec l'interface graphique (comme les boutons, les menus, etc.).
Il s'agit essentiellement d'un événement piloté par le modèle de ce qui peut être mis en place assez bien avec les signaux et les slots modèle. les signaux sont des événements qui sont générés par des objets (pensez composants GUI) et les machines à sous sont les récepteurs de ces événements.
Voici un exemple: imaginez que vous avez une case à cocher, représenté comme un objet dans votre langage de programmation. Plusieurs choses peuvent arriver à la case "actif": il peut être activé, ce qui à son tour signifie aussi qu'il soit défini ou indéfini. Ce sont les signaux qu'elle peut émettre. Nous allons les nommer checkboxToggled, checkboxSet et checkboxUnset. Comme vous le voyez, dans cet exemple, la case est toujours émettent de la checkboxToggled signal lorsqu'elle est activée, mais aussi exactement l'un des deux autres signaux, en fonction de la façon dont les changements d'état.
Maintenant, imaginez avoir quelques autres objets, à savoir une étiquette, qui, pour les besoins de cet exemple, il existe toujours comme un objet, mais peut "apparaître" et "disparaître" et un système de bip (également représentée par un objet), qui peut simplement émettre un signal sonore. Ce sont les fentes de ces objets ont. Nous les appellerons "messageAppear", "messageDisappear" et "bip ""bip".
Supposons que vous voulez que le système de bip de bip à chaque fois que la case à cocher est activée, et l'étiquette pour faire apparaître ou disparaître selon que l'utilisateur cochée ou décochée la case à cocher.
Vous devez connecter les signaux suivants pour les emplacements suivants (les signaux sur la gauche, fentes sur la droite):
C'est principalement ça.
les signaux et les slots peuvent aussi avoir des arguments. Par exemple, en utilisant un curseur qui définit une valeur numérique, vous souhaitez envoyer la valeur modifiée avec le signal émis dès que l'utilisateur déplace le curseur: sliderChanged(int).
Bien sûr, de le faire réellement quelque chose d'utile, on peut écrire ses propres classes contenir ses propres signaux et slots. Cela se fait assez facilement et d'utiliser ses propres signaux et slots, vous avez une belle façon d'interagir avec l'interface graphique ou d'autres parties de votre code dans l'organisation d'une manifestation.
Gardez à l'esprit que les signaux et les slots sont souvent symétrique dans le sens qu'il peut souvent être un signal correspondant à une fente. Par exemple, une case à cocher peut émettre un signal lorsqu'elle est activée, mais elle peut aussi contenir une fente qui permet d'activer la case à cocher lui-même. Il serait facile à mettre en œuvre pour séparer les cases qui sont à l'opposé les uns des autres.
Je suppose que vous parlez de QT sur les signaux et les slots.
C'est très simple.
Une instance d'une classe peut mettre le feu à un signal et une autre instance d'une autre classe peut attraper le signal à un slot. C'est un peu comme un appel de fonction seulement que le gars qui appelle la fonction n'a pas besoin de savoir qui veut recevoir l'appel.
La meilleure façon d'illustrer avec un exemple.
La classe QPushButton a un signal QPushButton::clicked(). Ce signal est déclenché chaque fois que le bouton est cliqué. Le bouton-poussoir n'a pas besoin de savoir qui est intéressé de savoir qu'un clic a eu lieu. il vient de déclencher le signal et celui qui est intéressé peut s'y connecter.
Le QDialog dans laquelle le bouton est placé dans est en effet intéressé à savoir lorsque le bouton a été cliqué. Elle a la fente MyDialog::buttoncliked(). Sur MyDialog c'tor vous devez vous connecter() les boutons de la souris() signal de la boîte de dialogue buttoncliked() fente de sorte que la fente sera appelée lorsque le signal est déclenché.
Un tas de plus avancé:
Voici plus d'informations dans la documentation de QT.
Le meilleur exemple et l'explication que j'ai trouvé pour les signaux et slots est ce projet de code de l'article.
Il y a un malentendu commun que les classes sont des noms comme Personne, le Chien, le Vélo et autres. Alors il est logique de penser qu'une personne (exemple) a un chien et un vélo.
Commençons par ce que les objets sont (censés être). Les objets sont des données et des procédures. Quels sont les programmes? Les données et les procédures. Les objets sont censés être (relativement) les "petits" indépendants de sous-programmes. Parce que la programmation orientée-objet est enseignée très vaguement et utilisée à mauvais escient (citation nécessaire), les gens pensent que tout doit être d'une classe ou d'un objet. Ce n'est pas tellement, les objets sont des "petits" programmes indépendants avec un "petit" API publique (sous-programmes).
Certains programmeurs n'ont même pas briser leur projet en sous-programmes et simplement utiliser des objets pour lesquels des données et les procédures sont plus adaptés.
Maintenant, en supposant que nous sommes d'accord que les objets sont des programmes, nous pouvons dire que dans la plupart des cas, les programmes n'ont pas besoin d'avoir des copies d'autres programmes de taille et de complexité comparables (j'.e un objet n'est pas un pointeur vers un autre objet), il peut avoir besoin de petits programmes pour la gestion des données (comme des données-structures) mais à mon humble avis n'a pas besoin d'un autre objet.
Pourquoi? Parce que le couplage des objets les rend dépendants. Pourquoi est-ce mauvais? Parce que lorsque les objets sont indépendants, vous pouvez les tester et promettent aussi d'autres programmeurs et les clients que l'objet (un petit programme indépendant) est capable d'effectuer certaines tâches avec une grande certitude. Vous pouvez également être sûr qu'il continue à se produire aussi longtemps qu'aucune des modifications ont été apportées à cet objet.
Donc, ce sont des machines à sous et des signaux? Si vous comprenez que les objets sont comme des programmes, et ils ne devraient pas idéalement tenir des copies ou des pointeurs vers d'autres objets que vous avez besoin de quelque façon pour eux de communiquer. Par exemple, les processus qui s'exécutent sur votre ordinateur peuvent utiliser les sockets, les adresses IP et les ports pour communiquer. Les objets peuvent utiliser quelque chose de très similaire à RPC appelé les signaux et les slots. Ces sont une structure de données conçu comme un intermédiaire entre deux objets de taille que l'objet de la banque du sous-routines (
slots
) et de permettre à d'autres objets appeler (signal
) ces subrutines (slots
) avec les paramètres appropriés sans rien connaître de ces autres objets autres que les paramètres dont ils ont besoin.De sorte que la structure sous-jacente, sont des ensembles (éventuellement tableaux) de (peut-être) fortement typé procédure pointeurs, que d'autres objets peuvent appeler avec des paramètres appropriés, sans un pointeur vers ces objets. Les appelants ont seulement besoin de l'accès au signal de l'objet à la place (qui ne détient pas de détails de mise en œuvre) qui définit les paramètres attendus.
C'est aussi souple car il permet à certains cas d'utilisation comme les machines à sous qui ne répondent au signal une fois, plusieurs fentes pour un signal et d'autres cas d'utilisation comme anti-rebond.