IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Passer un argument à un slot

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Par défaut Passer un argument à un slot
    Bonjour,
    Toujours dans le cadre de mon projet BTS, je dois parvenir à passer un argument de type objet à un slot relié à un signal. Mais ça marche pas
    Je m'explique, le projet est un client - serveur dont le serveur est développé sous Qt 5.0.1. Une fois la connexion accepté, le slot connexion est appelé via le signal newConnexion.

    Nota : en réalité, les clients du système sont des serveurs de production mais pour éviter la confusion, je les appele des clients pour mon projet.

    Le slot connexion gère une connexion d'un client au serveur. Chaque client est représenté par un objet contenant son nom, son adresse IP, ... cet objet est instancié dans le slot et il y a autant d'objet que de client connecté.
    Dans la suite du slot, le slot donnees est appelé via le signal readyRead.
    Le slot donnees permet de gérer la réception du message envoyé par le client mais je voudrai passer à ce slot l'objet du client instancié précédement.

    Seul problème, pour passer un argument à un slot, il faut que le signal accepte le même type d'argument et c'est là où je coince
    J'ai déjà essayé d'appeler un signal personnalisé mais ça ne marche pas :/

    De l'aide me serai du plus grand secours !

    Voici le code :

    widget.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    namespace Ui {
    class Widget;
    }
     
    class Widget : public QWidget
    {
        Q_OBJECT
        Base bdd;
        QTcpServer *serveur;
        bool etatEcoute;
        QList<QTcpSocket *> serveurs;
        static int nbre;
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    private:
        int accepterConnexion();
        int traitement(Serveur, QString);
    public slots:
        void demarrerSurveillance();
        void arreterSurveillance();
        void connexion();
        void donnees(Serveur);
        void deconnexionServeur();
        void changerPort();
        void quitter();
    signals:
        void lecture(Serveur);
    private:
        Ui::Widget *ui;
    widget.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void Widget::connexion()
    {
        ui->etatAppli->setText("Serveur µZ détecté, en attente de réception");
        serveur->setProperty("readyRead", "readyRead");
        Serveur serv(serveur->nextPendingConnection()); // à cet instant, on sait qu'un serveur s'est connecté mais on ne sait pas qui
        qDebug("serveur instancier numero : %d", serv.getId());
        serveurs << serv.getServeur();
        connect(serv.getServeur(), SIGNAL(lecture(Serveur)), this, SLOT(donnees(Serveur))); 
        connect(serv.getServeur(), SIGNAL(disconnected()), this, SLOT(deconnexionServeur()));
    }
    void Widget::donnees(Serveur serv)
    {
        emit lecture(serv);
        ui->etatAppli->setText("Réception des données en cours");
        //QString trame = 0;
     
        // ... après réception de la trame
        //traitement(serv, trame);
     
    }
    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ce qu'il faut comprendre, c'est qu'un slot n'est, en définitive, qu'une fonction tout à fait normale!!! (enfin, dans son fonctionnement propre s'entend )

    Si tu veux que ton slot prenne un argument en paramètre, il "suffit" de rajouter le dit argument au prototype de ta fonction .

    La seule chose, c'est qu'il faut faire attention à la durée de vie de tes variables, car, si tu crées des variables "sur la pile" (comme c'est le cas de ta variable Serveur serv), la dite variable sera détruite au moment précis où tu sortiras de la portée dans laquelle tu l'as déclarée (au moment où tu atteints l'accolade fermante de la fonction).

    Enfin, il faut comprendre ce qu'est le principe des signaux et des slots.

    Un signal n'est jamais qu'un message adressé "à tout ce qui peut être intéressé" qui indique, en gros "salut, j'ai été manipulé (de quelque manière que ce soit), il faut que vous vous mettiez à jour".

    Le slot quant à lui permet à "ce qui peut être intéressé" par le signal en question de savoir "comment réagir face à ce signal".

    Le fait est que le signal peut être émis depuis "n'importe où" et donc "n'importe quand".

    Mais ce n'est pas au moment de la connexion d'un nouveau socket qu'il y aura une lecture, et très certainement encore moins une déconnexion!.

    Les informations dont tu disposeras au moment de la lecture de données ou de la déconnexion d'un serveur ne sont donc en aucun cas les données dont tu disposes au moment de la connexion du serveur!

    Les données dont tu disposes, c'est... les QTcpSocket * de ta liste serveurs (ou le QTcpServer *serveur s'il a quelque chose à voir dans l'histoire)

    Ce n'est donc pas un objet de type Serveur (dont on ne sait absolument rien dans le code que tu présente ) mais beaucoup plus vraisemblablement... un pointeur sur le QTcpSocket qui t'intéresse
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Comment passer des argument a un script php ?
    Par Florina dans le forum Linux
    Réponses: 2
    Dernier message: 11/12/2005, 14h38
  2. Awk - Passer un argument ?
    Par init dans le forum Linux
    Réponses: 6
    Dernier message: 19/10/2005, 12h56
  3. Comment passer les arguments à un script perl
    Par belgampaul dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2005, 12h52
  4. Réponses: 8
    Dernier message: 30/05/2005, 13h55
  5. [Struts] Passer un argument dans un property
    Par Malaussene dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/09/2004, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo