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

Qt Discussion :

Slot dans une autre classe


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 50
    Par défaut Slot dans une autre classe
    Bonjour

    Je suis en train de développé un chat avec Qt Creator et Qt Designer.

    J'ai créer une interface graphique avec Qt Designer et 2 fichier cpp : client.cpp, mainwindows.cpp

    Mon problème, c'est que je n'arrive pas à connecter un bouton de l'interface avec un slot issue d'une autre classe.

    Mon code :

    client.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
    #ifndef CLIENT_H
    #define CLIENT_H
     
     
    class QTcpSocket;
     
    class client
    {
     
    public:
        client();
     
    private slots:
            void connexion();
     
    private:
           QTcpSocket *socket ;
    };
     
    #endif // CLIENT_H
    client.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
    #include "client.h"
     
     
    client::client()
    {
    }
     
    //Connexion à 1 serveur
    void MainWindow::connexion()
    {
        QString IPHost;
        IPHost = Ui::host;
        socket->connectToHost("IPHost", "4000");
        if (!socket)
        {
            cout<<"1"<<endl;
        }
    }
    mainwindows.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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QDialog>
     
    namespace Ui
    {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    private slots:
        void fenetre_chat();
     
    private:
        void affichertexte();
        Ui::MainWindow *ui;
    };
     
    #endif // MAINWINDOW_H
    mainwindow.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
    21
    22
    23
    24
    25
    26
    27
    28
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "client.h"
     
    //Affichage de la fenêtre principale
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
    {
     
        ui->setupUi(this);
        //connect(ui->chat_bouton, SIGNAL(clicked()), this,  SLOT(fenetre_chat()));
        connect(ui->connexion_bouton, SIGNAL(clicked()), client, SLOT( connexion() ) );
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::fenetre_chat()
    {
         QDialog FENChat ;
         FENChat.show();
    }
     
    void MainWindow::affichertexte()
    {
       ui->texte->setText("allo");
    }
    Je pense que l'erreur vient de la
    connect(ui->connexion_bouton, SIGNAL(clicked()), client, SLOT( connexion() ) );

    Merci de votre aide !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pense à rester cohérent dans le nom de tes classes : MainWindow avec une majuscule au début, et Client aussi.
    Et c'est justement cette confusion : client n'est pas une instance mais juste un type, qui est à l'origine de ton problème.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 50
    Par défaut
    J'ai mis des majuscules a la classe client

    client.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
    #ifndef CLIENT_H
    #define CLIENT_H
     
     
    class QTcpSocket;
     
    class Client
    {
     
    public:
        Client();
     
    private slots:
            void connexion();
     
    private:
           QTcpSocket *socket ;
    };
     
    #endif // CLIENT_H
    client.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
    #include "client.h"
     
     
    Client::Client()
    {
    }
     
    //Connexion à 1 serveur
    void Client::connexion()
    {
        QString IPHost;
        IPHost = Ui::host;
        socket->connectToHost("IPHost", "4000");
        if (!socket)
        {
            cout<<"1"<<endl;
        }
    }
    dans le mainwindow.cpp je laisse : connect(ui->connexion_bouton, SIGNAL(clicked()), Client, SLOT( connexion() ) );
    mais sa me met toujours la même erreur.

    Je comprends pas trop ce qu'es une instance, je n'ai développé qu'en c, c'est mon 1er programme en c++, j'ai un peu de mal :s

  4. #4
    Invité
    Invité(e)
    Par défaut
    La fonction connect() (dans l'utilisation que tu en fais) attend en 3ème argument un pointeur sur un objet Client, et non le simple type Client qui n'a rien à faire ici.
    Ainsi quelque part tu doit avoir quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client * client = new Client(/* arguments */);
    Et c'est ce pointeur que tu rentreras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui->connexion_bouton, SIGNAL(clicked()), client, SLOT( connexion() ) );

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 50
    Par défaut
    J'ai inséré ce code dans mainwindow.cpp
    Client * client = new Client(/* arguments */);
    mais j'ai une erreur :
    erreur : C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)'ÿ: impossible de convertir le paramètre 3 de 'Client *' en 'const QObject *'
    Les types point‚s n'ont aucun rapport entre euxÿ; conversion n‚cessitant reinterpret_cast, cast de style C ou cast de style fonction

    Si j'ai bien compris, client n'est pas un QObject pour lui. Il faut que je declare client.h comme sa ?

    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
    #ifndef CLIENT_H
    #define CLIENT_H
    
    
    class QTcpSocket;
    
    class Client
    {
        Q_OBJECT
    
    public:
        Client();
    
    private slots:
            void connexion();
    
    private:
           QTcpSocket *socket ;
    };
    
    #endif // CLIENT_H

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pour utiliser une classe dans le système de signal/slot, celle-ci doit remplir deux critères :
    • définir la macro Q_OBJECT
    • Hériter directement ou non de QObject

    Voir la FAQ pour plus de détails.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Définir une classe dans une autre classe
    Par acieroid dans le forum C++
    Réponses: 7
    Dernier message: 21/05/2006, 23h24
  2. Probleme d'apel de fonction dans une autre classe
    Par freecell31 dans le forum MFC
    Réponses: 24
    Dernier message: 13/05/2006, 11h34
  3. Réponses: 1
    Dernier message: 05/05/2006, 14h37
  4. Acceder à un object qui se trouve dans une autre classe
    Par ceres02 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 08/02/2006, 13h29
  5. Réponses: 12
    Dernier message: 11/11/2005, 14h25

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