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 :

Signal et slot

  1. #1
    Membre confirmé
    Profil pro
    Ingénieur système
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur système

    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Par défaut Signal et slot
    bonjour

    l'exemple pour comprendre les signal et slot est très bien sauf qu'il n'a pas de déclaration de fenêtre principale :
    http://matthieu-brucher.developpez.c...t/signal-slot/

    HELP : j'ai ajouté la déclaration d'une fenêtre dans un fichier séparé et le connect ne fonctionne plus !!

    plutôt que de remettre le source j'ai organisé l'exemple comme suit :

    mainform.h (contient la déclaration de la classe de la fenêtre principale)
    mainform.cpp (contient les méthodes de la classe de la fenêtre principale)

    exemple.h (contient la déclaration de la classe de l'exemple)
    exemple.cpp (contient les méthodes de la classe exemple)

    main.cpp (contient la fonction main() point d'entrée du programme)

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    Avec un peu de code, ce sera mieux, je n'ai pas de boule de cristal fonctionnelle dans le coin. Au pif, tu as relancé qmake ? Tu as bien mis la macro QOBJECT dans la définition de ta classe ? Tu hérites bien de QObject, d'une manière ou d'une autre ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre confirmé
    Profil pro
    Ingénieur système
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur système

    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Par défaut le code
    voici le code modifié qui ne fonctionne pas

    exemple.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
    #ifndef EXEMPLE
    #define EXEMPLE
     
    #include <QMainWindow>
    #include <QString>
     
    #include <QApplication>
    #include <QPushButton>
    #include <QInputDialog>
    #include <QMessageBox>
     
    class Exemple: public QMainWindow
    {
      Q_OBJECT
     
    public:
      Exemple();
     
    public slots:
      void s_clicked();
     
    private:
      QPushButton *button;
    };
     
     
    #endif
    exemple.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "exemple.h"
     
    Exemple::Exemple() : QMainWindow()
    {
      button = new QPushButton("Hello!", this);
     
      connect(button, SIGNAL(clicked()), this, SLOT(s_clicked()));
    }
     
    void Exemple::s_clicked()
    {
      QString texte = QInputDialog::getText(this, "Demande", "Entrez du texte");
    }
    mainform.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
    #ifndef MAINFORM_H
    #define MAINFORM_H
     
    #include <QApplication>
    #include <QWidget>
     
    #include "exemple.h"
     
    class MaFenetre : public QWidget
    {
    public:
        MaFenetre();
     
    };
     
    #endif
    mainform.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "MainForm.h"
     
    MaFenetre::MaFenetre() : QWidget()
    {
        setFixedSize(200, 100);
        Exemple exemple;
     
        exemple.show();
    }
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "mainform.h"
     
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
      QApplication app(argc, argv);
     
      MaFenetre Fenetre;
      Fenetre.show();
     
      return app.exec();
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Par défaut
    Bonjour,
    j'avoue que ce que tu souhaites obtenir reste obscure pour moi mais je vais tenter d'éclaircir.
    Dans un premier temps et pour constater un code qui marche, inclus dans ton main exemple.h, et remplace ces deux lignes :
    MaFenetre Fenetre;
    Fenetre.show();

    Exemple exemple;
    exemple.show();
    Ensuite, juste pour l'explication, ce n'est pas très conventionnel de créer une MainWindow dans un widget. L'inverse serait plus approprié, non?

    Enfin, pourquoi ton code n'affiche rien : dans le constructeur de MaFenetre, tu instancie de manière statique la mainwindow Exemple. Elle est donc détruite à la fin du constructeur. Si vraiment tu veux continuer dans ce sens, il te faut ici instancier dynamiquement via un pointeur de ta classe MaFenetre (comme cela est fait pour le boutton)

  5. #5
    Membre confirmé
    Profil pro
    Ingénieur système
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur système

    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Par défaut
    oui dwarfylo ca c'est ok (j'avais fait l'essai)

    mais je souhaiterai, pour faire plus propre, faire un code comme celui présenté ou j'aurai une classe fenêtre principale dans laquelle je metterai tous les objets à afficher

    c'est peut être pas trop conventionnel comme ca ?
    explique moi

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Par défaut
    En fait je ne suis pas bien sur de te comprendre. J'ai regardé l'exemple que tu évoques et il utilise bien une fenêtre dite "principale", qui est une QMainWindow. En fait, et je pense ne pas me tromper en t'aiguillant dans cette voie, toute application GUI Qt devrait démarrer par la définition d'une QMainWindow qui sera ton conteneur pour tous les autres éléments graphiques de ton application. C'est le principe même de cette classe. Ensuite tu peux définir des QWidget(ta classe fenêtre) qui elles seront des sous-éléments de la mainwindow, à organiser comme bon te semble. Mais pour vraiment comprendre, peut-être te faudrait-il regarder un tutoriel sur QDesigner, afin de constater de manière graphique comment agencer tes interfaces : http://ceg.developpez.com/tutoriels/...tdesigner/#LIV

  7. #7
    Membre confirmé
    Profil pro
    Ingénieur système
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur système

    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Par défaut
    pourquoi je souhaite faire comme ca :
    comme dis plus haut, pour correctement structurer le source

    le "this" fonctionne puisque implicitement je suis dans la fenêtre principale
    maintenant si on souhaite avoir plusieurs fenêtres il me semble important de créer une classe par fenêtre non ?

    -main.cpp
    main()
    accès classe fenêtre 1
    accès classe fenêtre 1

    -fenetre1.h (classe fenêtre 1)
    -fenetre1.cpp

    -fenetre2.h (classe fenêtre 2)
    -fenetre2.cpp

    donc comment faire pour que mon exemple fonctionne ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Par défaut
    fenetre.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
    #ifndef FENETRE_H
    #define FENETRE_H
     
    #include <QWidget>
    #include <QPushButton>
     
    class fenetre : public QWidget
    {
        Q_OBJECT
     
    public:
        explicit fenetre(QWidget *parent = 0);
        ~fenetre();
     
    private:
        QPushButton* button;
     
    private slots:
        void slot();
    };
     
    #endif // FENETRE_H
    mainwindow.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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
     
    #include "fenetre.h"
     
     
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    private:
        fenetre* mafenetre;
    };
     
    #endif // MAINWINDOW_H
    fenetre.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
    #include "fenetre.h"
    #include <QDebug>
     
    fenetre::fenetre(QWidget* parent):
        QWidget(parent)
    {
        button = new QPushButton(this);
        button->setText("Bouton");
     
        connect(button,SIGNAL(clicked()),this,SLOT(slot()));
    }
     
    fenetre::~fenetre()
    {
     
    }
     
    void fenetre::slot()
    {
        qDebug() << "SLOT!";
    }
    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
    #include "mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    {
        setFixedSize(800,600);
     
        mafenetre=new fenetre(this);
    }
     
    MainWindow::~MainWindow()
    {
     
    }
    main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <QtGui/QApplication>
    #include "mainwindow.h"
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
     
        return a.exec();
    }

Discussions similaires

  1. probleme de code Qt: signal and Slot
    Par vivh349 dans le forum Qt
    Réponses: 10
    Dernier message: 08/07/2009, 12h17
  2. Signals et Slots avec QextSerialPort
    Par sardik dans le forum Qt
    Réponses: 1
    Dernier message: 05/05/2009, 17h30
  3. SIGNAL et SLOT (gros debutant)
    Par mesobius dans le forum Débuter
    Réponses: 4
    Dernier message: 19/01/2009, 11h18
  4. connect Signal et slot perso
    Par freecircus dans le forum Qt
    Réponses: 3
    Dernier message: 13/12/2006, 20h25

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