Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Programmation > Bibliothèques > Qt > Du Qt en Java avec Qt Jambi > Les signaux et les slots > Emettre un signal > Lecture du tutoriel

Emettre un signal

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : Natim
Visualisations : 1 347

Plus d'informations Plus d'informations
On peut bien sur utiliser les signaux existants, mais ça peut-être intéressant d'émettre des signaux entre ses propres objets.

Heureusement pour nous, avec Qt Jambi c'est très facile.
Voyez plutôt ...
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Qu'est-ce que c'est un signal ?

Un signal c'est un Objet qui est défini comme attribut public d'une classe. (c'est assez rare d'avoir un attribut public pour le préciser)

Cet objet contient deux méthodes publiques principales :



Un signal peut émettre avec lui des variables en Java entre 0 et 9 variables.
Le nom du signal dépend de ce nombre de variables que l'on veut envoyer.

Voici comment on ajoute un signal à notre classe :

Code : Java
1
public Signal1<Integer> valueChanged = new Signal1<Integer>();


Comme vous le comprendrez surement, ce signal émet avec lui un entier (Integer).
C'est le signal de LCDNumber.

Et voilà, un signal ce n'est rien de plus que ça.

Emettre un signal

Pour qu'un signal soit utile, il faut un jour ou l'autre l'émettre.
Cela veut dire qu'on active la connection avec le slot.

Autant se donner un but ;)

Cahier des charges


On va commencer par créer un nouveau widget qui contiendra un champ de texte QLineEdit ainsi qu'un QLabel.

Notre objet, lorsque le texte du QLineEdit va être changé va émettre un signal.
Ainsi, il pourra modifier le texte d'une autre boite de dialog. (Un minichat entre deux dialog).

ça va ressembler à ça :
Chat inter Dialog


Étant donné que QLineEdit s'occupe déjà de nous envoyer un signal, on ne va faire que le retransmettre.

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import com.trolltech.qt.gui.*;
 
public class DialogButton extends QDialog {
        private QLabel text;
        
        public final Signal1<String> configured = new Signal1<String>();
        
        public DialogButton(String titre){
                QLabel label = new QLabel(tr("Entrez votre message:"));
                QLineEdit lineEdit = new QLineEdit();
                text = new QLabel();
                QVBoxLayout layout = new QVBoxLayout( this );
                layout.addWidget(label);
                layout.addWidget(lineEdit);
                layout.addWidget(text);
                setLayout(layout);
                setWindowTitle(titre);
                lineEdit.textChanged.connect(this, "emit(String)");
        }
        
        public void emit(String s){
                configured.emit(s);     
        }
        
        public void write(String lineEditText){
                if(text.text() != lineEditText){
                        text.setText(lineEditText);     
                }
        }
        
        public static void main(String[] args){
                QApplication.initialize(args);
                DialogButton app = new DialogButton("Dialog 1");
                DialogButton ap2 = new DialogButton("Dialog 2");
                app.configured.connect(ap2, "write(String)");
                ap2.configured.connect(app, "write(String)");
                app.show();
                ap2.show();
                QApplication.exec();
        }       
}


Regardons de plus prêt :

Code : Java
1
public final Signal1<String> configured = new Signal1<String>();

On ajoute un signal configured à notre widget qui va émettre avec lui une chaine de caractères.
Cette chaine sera le contenu du LineEdit.

Code : Java
1
lineEdit.textChanged.connect(this, "emit(String)");

Ici on connecte le signal reçu du lineEdit quand le texte a changé avec notre méthode emit qui va émettre notre signal.

Code : Java
1
2
3
public void emit(String s){
      configured.emit(s);     
}


Notre méthode emit() va seulement émettre notre signal configured.

Code : Java
1
2
3
4
5
public void write(String lineEditText){
       if(text.text() != lineEditText){
                text.setText(lineEditText);     
       }
}

Dans notre méthode write, on vérifie que le texte a bien changé.
C'est une simple précaution pour éviter des boucles qui pourraient provoquer des scintillements de l'interface ou une augmentation indésirable de l'activité du processeur.

On ne sait en effet pas quels sont les mécanismes mis en place par la méthode setText. Donc par précaution, (surement inutile dans ce cas) on évite des calculs inutiles.

Dans notre méthode main, on crée des boites de dialogue que l'on nomme pour les différencier.
On connecte le signal de l'une avec la méthode write de l'autre et vice-versa.

Maintenant, il est temps de tester.

Petit exercice

Énoncé de l'exercice



Citation
En reprenant le résultat de l'exercice précédent, on souhaite, lorsqu'on modifie un slider, modifier les états de tous les sliders précédents.


Résultat Attendu



Un signal récursif ...


Question subsidiaire :



Citation
Définir l'ordre dans lequel ont été modifiés les sliders de la boite de dialogue du screenshot.
Pour cela on numérotera les sliders ainsi (0,0) pour le premier et (0,1) pour le deuxième, ... (2,0) pour le premier de la troisième ligne


Secret (cliquez pour afficher)
Le premier à avoir été modifié est le slider(2,2). Il est à 68 et a donc modifié tous les autres à 68.
Le deuxième est le slider(2,1) il est à 46 et à modifié tous les précédents à cette même valeur.
Le troisième est le slider(1,1) de même il a mis tous les précédents à 57.
Le quatrième et dernier et les slider(0,0) qui est à 73.


Solution



Secret (cliquez pour afficher)
La solution (si jamais vous en aviez besoin) se trouve dans les sources de qtjambi.
(com/trolltech/examples/tutorial/ConnectedSliders.java)

Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 13/10/2007 à 04:20:33
Modifié : le 08/11/2008 à 20:41:36
Avancement : 0%
Licence : Creative Commons BY-SA

L'orthographe, la grammaire et la présentation de ce tutoriel ont été vérifiées par les zCorrecteurs.
1 commentaire

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 187 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0239s (0.0124s)