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 :

Connexion entre signal et slot

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut Connexion entre signal et slot
    Bonjour,

    J'ai créer le code suivant, et j'aimerais savoir pouquoi view ne s'affiche pas. J'ai bien tous mes boutons au bon endroit mais pas view. Alors que si je ne crée pas de classe exemple et met tout dans le main directement, l'affichage est correct mais les connections signal, slot ne fonctionne pas. Peut-on m'expliquer pourquoi ?

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include "exemple.h"
    #include <QApplication>
    #include <QPushButton>
    #include <QInputDialog>
    #include <QMessageBox>
    #include <QGraphicsScene>
    #include <QGraphicsView>
    #include <QPushButton>
    #include <QGridLayout>
     
    int main(int argc, char *argv[])
    {
      QApplication app(argc, argv);
     
      Exemple exemple;
     
      exemple.showMaximized();
      return app.exec();
    }
     
    Exemple::Exemple()
      :QWidget()
    {
      QPushButton *exit=new QPushButton("echap");
      QPushButton *rectangle=new QPushButton("rectangle");
      QPushButton *ellipse=new QPushButton("ellipse");
      QPushButton *segment=new QPushButton("segment");
      QPushButton *cercle=new QPushButton("cercle");
      QPushButton *para=new QPushButton("parallélogramme");
      //connect( exit, SIGNAL(clicked()), &a, SLOT(quit()) );
      QGraphicsScene scene;
      scene.addRect(QRectF(100, 200, 11, 16));
     
      QGraphicsView view(&scene);
     
      QGridLayout *gridLayout = new QGridLayout(this);
      gridLayout->addWidget(&view,0,0,6,4);
      gridLayout->addWidget(exit,6,5,1,1);
      gridLayout->addWidget(rectangle,1,5);
      gridLayout->addWidget(ellipse,3,5,1,1);
      gridLayout->addWidget(segment,0,5,1,1);
      gridLayout->addWidget(cercle,4,5,1,1);
      gridLayout->addWidget(para,2,5,1,1);
      this->setLayout(gridLayout);
      connect(para, SIGNAL(clicked()), this, SLOT(s_clicked()));
      //connect(this, SIGNAL(pseudoclick(QString&)), this, SLOT(s_clicked_texte(QString&)));
    }
     
    void Exemple::s_clicked()
    {
      QString texte = QInputDialog::getText(this, "Demande", "Entrez du texte");
      emit s_clicked_texte(texte);
    }
     
    void Exemple::s_clicked_texte(QString& texte)
    {
      QMessageBox message(QMessageBox::Information, "Ceci est un test d'information", "Le tesxte\n" + texte + "\na été entréé");
      message.exec();
    }

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    C'est normal ta variable view est detruite à la fin du constructeur de la classe Exemple.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut
    comment empêcher sa destruction ?
    Je ne vois pas où tu dis qu'elle est détruite...
    Pourquoi alors dans ce cas mes QPushButton ne sont pas détruits aussi ?

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    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
    Exemple::Exemple()
      :QWidget()
    {
      QPushButton *exit=new QPushButton("echap");
      QPushButton *rectangle=new QPushButton("rectangle");
      QPushButton *ellipse=new QPushButton("ellipse");
      QPushButton *segment=new QPushButton("segment");
      QPushButton *cercle=new QPushButton("cercle");
      QPushButton *para=new QPushButton("parallélogramme");
      //connect( exit, SIGNAL(clicked()), &a, SLOT(quit()) );
      QGraphicsScene scene;
      scene.addRect(QRectF(100, 200, 11, 16));
     
    //Ici tu fais pas de new donc la view est allouée sur la pile et a la fin du constructeur elle n'existe plus.
      QGraphicsView view(&scene);
     
      QGridLayout *gridLayout = new QGridLayout(this);
      gridLayout->addWidget(&view,0,0,6,4);
      gridLayout->addWidget(exit,6,5,1,1);
      gridLayout->addWidget(rectangle,1,5);
      gridLayout->addWidget(ellipse,3,5,1,1);
      gridLayout->addWidget(segment,0,5,1,1);
      gridLayout->addWidget(cercle,4,5,1,1);
      gridLayout->addWidget(para,2,5,1,1);
      this->setLayout(gridLayout);
      connect(para, SIGNAL(clicked()), this, SLOT(s_clicked()));
      //connect(this, SIGNAL(pseudoclick(QString&)), this, SLOT(s_clicked_texte(QString&)));
    }
    Pour info pour tes boutons ils fonctionnent par ce que tu as fais un new. En revanche tu as une fuite mémoire avec tes boutons et surtout tu ne peux plus y accéder à partir d'une autre méthode de ta classe Exemple...

    A mon avis regarde quelques cours de C++ et les exemples Qt si tu ne vois toujours pas de quoi je parle.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut
    Merci !!!
    J'ai compris. J'ai eu des cours de C++ mais le passage sur les pointeurs n'a pas été très bien expliqué, quand aux fuites mémoires, j'y pense, ceci n'était qu'un bout de code pour essayer l'affichage. Encore merci !!

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Petite précision :
    En revanche tu as une fuite mémoire avec tes boutons
    Je pense qu'avec le système de parent/enfant de Qt, les boutons seront correctement détruits (le QGridLayout devient parent des widgets qu'il contient et il est lui même enfant du QWidget), sauf erreur de ma part.


    Pensez au ? Merci

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

Discussions similaires

  1. [QtCore] Signal et slot entre classes
    Par tbar403 dans le forum PyQt
    Réponses: 2
    Dernier message: 01/03/2011, 12h45
  2. Problème de connexion entre un signal et un slot
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 11/01/2011, 12h40
  3. Réponses: 4
    Dernier message: 03/09/2010, 15h52
  4. Connexion "directe" signal - slot
    Par broidsy dans le forum Qt
    Réponses: 3
    Dernier message: 27/02/2006, 09h37

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