Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment "attendre" un signal

avec Qt

Sujet résolu
    11 février 2009 à 19:45:04

    Bonjour,
    Je me suis mis au Java et je programme ce qui me passe par la tête pour me familiariser avec les libs.
    Alors voila j'ai voulu recréé ma propre console^^
    Je veux que la console puisse être utiliser comme celle de base.
    Je veux refaire la console mais cette fois avec Qt... c'est tout.

    Console Java :


    Scanner sc = new Scanner(System.in);
    System.out.println("Salut, comment t'apelle tu ?");
    String nom = sc.nextLine();
    System.out.println("Bienvenu "+nom);
    


    Console Perso :


    Console c = new Console();
    c.println("Salut, comment t'apelle tu ?");
    String nom= c.scanString();
    c.println("Bienvenu "+nom);
    


    Avec deux fonctions : print et scan.
    pour le print il n'y a pas de problème, parcontre pour le scan je dois attendre que l'utilisateur entre du texte puis appuie sur la touche enter pour pouvoir ensuite retourner la saisie, ce que je n'arrive pas à faire.

    Petit aperçu. (c'est un exemple !)
    Image utilisateur

    Marche à suivre de la méthode scanString:
    • Début de la méthode scanString
    • la méthode autorise l'utilisateur d'enter du texte (peu importe ou et comment)
    • Panant ce temps la méthode attend tranquillement que l'utilisateur presse la touche enter
    • la méthode récupère le String
    • la méthode retourne le String
    • Fin de la méthode

    je n'arrive pas à faire ce qui est en rouge.
    Voir ligne 37.


    import com.trolltech.qt.gui.QLineEdit;
    import com.trolltech.qt.gui.QPlainTextEdit;
    import com.trolltech.qt.gui.QVBoxLayout;
    import com.trolltech.qt.gui.QWidget;
    
    
    public class Console extends QWidget {
    	private QPlainTextEdit cout = new QPlainTextEdit();
    	private QLineEdit cin = new QLineEdit();
    
    	public Console()
    	{
    		cout.setReadOnly(true);
    		cin.setReadOnly(true);
    		
    		this.setWindowTitle("Console");
    		QVBoxLayout layout = new QVBoxLayout();
    		layout.addWidget(cout);
    		layout.addWidget(cin);
    		this.setLayout(layout);
    		this.show();
    	}
    	
    	public void print(String str)
    	{
    		cout.appendHtml(str);
    	}
    	public void println(String str)
    	{
    		print(str+"\n");
    	}
    
    	public String scanString()
    	{
    		cin.setReadOnly(false);
    		cin.focusWidget();
    		// Attendre le signal cin.returnPressed()
    		// ...
    		// ...
    		cin.setReadOnly(true);
    		String str= cin.text();
    		cin.clear();
    		return str;
    	}
    	public int scanInt()
    	{
    		String str= scanString();
    		return Integer.valueOf(str);
    	}
    	public double scanDouble()
    	{
    		String str= scanString();
    		return Double.valueOf(str);
    	}
    }
    


    Pour ceux qui n'auraient rien compris:

    // Je sais faire ça mais c'est inutile !
    
    // Quand on presse sur enter ça appelle la fonction saisieTerminee()
    cin.returnPressed.connect(this, "saisieTerminee()");
    // Le problème est que tout doit ce passer uniquement dans scanString()...
    
    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2009 à 20:30:12

      Redéfini les méthodes de gestion du clavier (du moins celle que t'as besoin) et c'est dans la poche, mais bon c'est du moins la façon dont je ferais.

      Pour Qtjambi les méthodes a redéfinir pour gérer le clavier sont : protected void keyPressEvent(QKeyEvent) et protected void keyReleaseEvent(QKeyEvent) (C'est cadeau parce que c'est pas évident à trouver)
      • Partager sur Facebook
      • Partager sur Twitter
        11 février 2009 à 20:39:32

        Je suis désolé mais ça ne m'aide pas à faire retourné quelque chose de la méthode scan()

        Il me faut que la méthode "attende" qu'il se passe quelque chose pour ensuite se terminé en retournant le résultat.

        PS: Je sais connecter mon signal cin.returnPressed() à une méthode mais ça ne résoudra pas le problème.
        • Partager sur Facebook
        • Partager sur Twitter
          11 février 2009 à 21:28:37

          Bah c'est simple, une console ne comporte pas de champ pour entrer les informations donc autant prendre les toutes les lettres ou numéros entrés par l'utilisateur les stocker dans une variable (String par exemple) et en même temps les afficher dans ton QPlainTextEdit.

          Après si tu veux à tout prix utiliser un champ de saisie, go voir la javadoc.
          • Partager sur Facebook
          • Partager sur Twitter
            11 février 2009 à 21:58:11

            :p Tu n'as pas très bien compris mon problème ou alors j'ai mal expliqué.
            J'arrive sans problème a récupérer du texte que l'utilisateur entre. il n'y a aucun problème pour ça.
            Par contre le faire que et uniquement quand la méthode scanString() est demandée c'est une autre affaire.
            Je t'explique pas à pas:
            • Début de la méthode scanString
            • la méthode autorise l'utilisateur d'enter du texte (peu importe ou et comment)
            • Panant ce temps la méthode attend tranquillement que l'utilisateur presse la touche enter
            • la méthode récupère le String
            • la méthode retourne le String
            • Fin de la méthode

            La seul et unique chose que je n'arrive pas a faire est en rouge ! :colere2:
            • Partager sur Facebook
            • Partager sur Twitter
              11 février 2009 à 22:01:33

              ?? ben tans que la personne n'a pas pousser sur enter .... il n'y a pas d'événement a déclencher =/
              ou est le problème ?
              tu n'enregistre le text qu'une fois enter enfoncé quand même :o non ?

              • Partager sur Facebook
              • Partager sur Twitter
                11 février 2009 à 22:04:52

                S'il te plait pourrai tu faire un copier collé et essayer toi même. Peu-être que tu comprendra mieux le problème. ça à l'air simple comme ça mais c'est plus compliqué qu'on ne le pense... :(
                Si tu veux en langage français je veux demander à Java:
                attends que le signal returnPressed() de l'objet c soit émit
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  11 février 2009 à 22:08:51

                  Bah apparemment t'arrives pas déclencher l'événement quand l'user presse ENTER ?
                  L'user tape son texte, et quand il press ENTER bah tu récupères le texte du textField et tu l'affiches dans le panel (désolé pour les noms mais moi et Qt.. :S)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 février 2009 à 22:45:22

                    Regarde mon premier post et tu verra qu'il n'est pas inutile.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 février 2009 à 23:03:42

                      oui mon message précédent était dans la même idée que le premier de colibri :o
                      travail plus en événementiel... et c'est ok
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 février 2009 à 13:54:21

                        Dans une vrai console, la lecture du flux d'entrée est une action bloquante : ok, mais ce n'est pas la console qui s'en charge d'attendre, c'est le système.

                        Si tu veux simuler çà avec Qt, je pense que l'utilisation des mutex est une bonne solution.

                        Ta fonction autorise l'écriture => puis elle demande un mutex.

                        En parallele (ce qui suppose 2 threads, bon avec Qt je sais pas), grace à la programmation evenementielle tu recuperes les touches saisient que tu stockes dans un string. Si la touche "entrée" est detectée, tu liberes un mutex, et ta fonction continu.

                        C'est ce qui je pense se rapproche le plus de ce que tu veux.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 février 2009 à 14:56:38

                          Merci enfin une réponse constructive je vais aller me documenter sur les mutex qui me disent pour le moment rien du tout, ensuite je donnerai (je l'espère) la solution pour valider ce sujet comme résolu.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 février 2009 à 12:29:06

                            Citation : Antigol

                            Merci enfin une réponse constructive


                            Tu te fous de nous ou quoi ?! Ce que Maholmar a dit c'est exactement (à quelques mots près) ce que Snooooopy et moi t'avons dit !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 février 2009 à 18:27:50

                              Cherché... pas trouvé. j'abandonne
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 février 2009 à 19:56:03

                                Tu as pas du chercher plus de 10 secondes alors ...

                                Qt->doc->liste des classes->QMutex

                                Mutex

                                Autre truc utile

                                Trouvé en 1 min.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Comment "attendre" un signal

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown