Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Slots et paramètres

Un paramètre indépendant du signal... possible ?

    5 mai 2008 à 16:12:05

    Bonjour !
    J'aimerais utiliser un connect() pour connecter un signal à un slot ; le slot prenant en argument un entier que je connais au moment du connect et pas du signal en question.
    Est-il possible de faire quelquechose comme ça :

    int i = 3;
    connect(source, SIGNAL(signal()), cible, SLOT(slot(i)));
    

    ?

    J'ai essayé, et apparement ça ne marche pas. Y a-t-il une alternative ?

    En fait, j'ai 256 signaux qui viennent d'objets différents, et j'aimerais faire la différence avec ce "i" qui s'incrémenterait, ce serait plus simple que de créer 256 fonctions slots différentes :-°
    • Partager sur Facebook
    • Partager sur Twitter
      5 mai 2008 à 16:30:35

      Je crois que tu ne peux pas connecter un signal sans paramètre à un slot avec un paramètre. Les paramètres doivent correspondrent.
      • Partager sur Facebook
      • Partager sur Twitter
        5 mai 2008 à 16:34:14

        Donc le meilleur moyen serait de redéfinir le signal pour qu'il envoit un signe distinctif permettant d'identifier l'objet ? >_<
        Et j'imagine que pour redéfinir le signal, il faut redéfinir toute la classe... non ?

        [EDIT]

        Autre idée : est-il possible de faire un tableau de fonction, comme fonctions[256], et le définir en une boucle tel que fonctions[i]() = fonction(i) ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          5 mai 2008 à 17:45:44

          SLOT(slot(int))...
          • Partager sur Facebook
          • Partager sur Twitter
            5 mai 2008 à 18:00:16

            Comme youyou a pointé, tu ne peux pas mettre de variable dans un signal/slot, mais seulement des TYPES. exemple : int, bool, string, MaClasse, etc.
            • Partager sur Facebook
            • Partager sur Twitter
            Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
              5 mai 2008 à 18:22:05

              Oui, oui, j'ai compris cela.
              Mais dans ce cas, comment contourner le problème ?

              un tableau de fonctions aurait été très pratique : slot[i]() aurait ainsi fait l'affaire. Mais je ne sais pas comment faire...

              Il reste la solution de tout faire à la main (les 256 conditions redirigeant vers les 256 fonctions) mais ce ne me semble pas une bonne idée :-/

              En fait, je crée 256 connexions pour scanner les ordinateurs d'un réseau local à la recherche d'un serveur de jeu ; cela me fait donc 256 sockets, auxquels j'associe les méthodes qui permettent de traiter les données lorsqu'elles arrivent.
              Mais... le signal readyRead() des socket ne donne aucune information sur l'origine de ce signal, et le slot appelé ne peut donc savoir lequel des 256 sockets l'a appelé...

              Vous voyez une solution à ce problème ?...
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                5 mai 2008 à 18:26:43

                va voir les pointeur de fonction
                • Partager sur Facebook
                • Partager sur Twitter
                  5 mai 2008 à 18:49:26

                  Les pointeurs pourraient être interressants, si on pouvait pointer vers une fonction AVEC son paramètre, sans paramètre dans le pointeur de fonction. Un peu comme ça :

                  int f(int i);
                  int *p();
                  p = &f(4);

                  Mais, évidement, ça ne marche pas...

                  [EDIT]
                  Est-il possible d'utiliser le préprocesseur pour faire une boucle afin de définir facilement 256 fonctions ?

                  [EDIT 2]
                  J'ai trouvé une solution en réimplémentant l'objet émeteur du signal, en lui faisant garder son id et lui ajoutant une fonction, sans paramètre, appelant la fonction slot que je voulais appeler au début, avec comme paramètre la variable stockée dans l'objet... ouf !
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    5 mai 2008 à 20:12:14

                    int f(int i);
                    int (*p)();
                    p = &f(4);
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 mai 2008 à 21:51:41

                      Le problème c'est que là, p garde le résultat de la fonction f, lancée avec l'argument 4. Ce que je voudrais, c'est un pointeur vers l'appel de la fonction f muni de l'argument 4, ce qui semble impossible en c/c++ :(
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [Qt] Slots et paramètres

                      × 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