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 :

Problème ouverture fenêtre


Sujet :

Qt

  1. #1
    Membre actif
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Points : 261
    Points
    261
    Par défaut Problème ouverture fenêtre
    Bonjour, je suis actuellement sur un projet qui consiste a mettre en place un pacman.

    Mon role pour l'instant est de mettre en place le menu.
    Je dispo donc de : main.cpp , C_menu.h et C_menu.cpp

    J'arrive à afficher un menu en haut et le remplir, par contre je n'arrive pas à ouvrir quelque chose avec mes élément du menu :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <QApplication>
    #include <QtGui>
    #include "C_menu.h"
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    C_menu M;
    M.show();
     
        return app.exec();
    }
    C_menu.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
     
    #ifndef C_MENU_H_INCLUDED
    #define C_MENU_H_INCLUDED
    #include <QtGui>
    class C_menu : public QMainWindow
    {
     
     public :
     
     C_menu();
     void OuvrirScore();
     
     
    };
     
     
    #endif // C_MENU_H_INCLUDED
    C_menu.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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #include <QtGui>
     
    #include "C_menu.h"
     
    C_menu::C_menu()
    {
     
    QMenu *menuPacman = menuBar()->addMenu("&Fichier");
     
    QAction *beginaction = menuPacman->addAction("&Jouer");
    QAction *scoreaction = menuPacman->addAction("&High-Score");
     
     connect(beginaction, SIGNAL(triggered()), qApp, SLOT(quit()));
    // Ici je place une action au clique qui effectue la méthode C_menu::OuvrirScore()
     connect(scoreaction, SIGNAL(clicked()), this, SLOT(OuvrirScore()));
     
     
    //Définition taille fenetre
    this->setFixedSize(640,480);
    //Définition nom de la fenetre
    this->setWindowTitle("Nom de la compagnie - Pacman V 1.0");
    }
    // Cette fonction ne fait rien et c'est ici que je ne vois pas comment faire.
    void C_menu::OuvrirScore()
    {
        QWidget *zoneCentrale = new QWidget;
        QVBoxLayout *layout = new QVBoxLayout;
        QPushButton *test = new QPushButton(tr("Quit"));
     
    layout->addWidget(test);
     
         zoneCentrale->setLayout(layout);
     setCentralWidget(zoneCentrale);
    // deuxieme technique qui ne marche pas non plus :
     
     //   QVBoxLayout *layout = new QVBoxLayout;
     //   QPushButton *test = new QPushButton(tr("Quit"));
     
    //layout->addWidget(test);
     
       //  this->setLayout(layout);
    }
    Je souhaite donc simplement au clique sur High-score, que ça m'affiche un bouton dans ma page ! Merci de m'éclairer !
    Paye Tes Dettes - Applciation android.

    DevHackSecure - Pense bête d'un étudiant en informatique - Tutos DEV

    " I also realize that _everybody_ thinks that they are right, and that they are supported by all other right-thinking people. That's just how people work. We all think we're better than average." Linus Torvalds

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Hello,

    Il faut déclarer tes fonctions en tant que slots si tu veux les utiliser en tant que tel, dans ton .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class C_menu : public QMainWindow
    {
     Q_OBJECT // pour que ton objet puisse utiliser les signals et slots
    
     public :
     
     C_menu();
    
    public slots:
     void OuvrirScore();
     
     
    };
    Il n'y a rien à changer dans le .cpp mais il faudra peut-être que tu refasses un qmake avant le make pour prendre le Q_OBJECT en compte.

    Edit: et pour info les slots peuvent être déclarés de deux façons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public slots: // les fonctions sont publiques et peuvent être ajoutées dans un connect/disconnect en tant que slot
      void monSlot1();
    private slots: // les fonctions sont privées mais peuvent être ajoutées dans un connect/disconnect en tant que slot n'importe où (même depuis une autre classe qui ne pourrait accéder à ces fonctions privées)
      void monSlot2()
    Tu peux aussi déclarer des signaux avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    signals:
      void monSignal();
    Et les utiliser avec un emit, exemple:G.

  3. #3
    Membre actif
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Points : 261
    Points
    261
    Par défaut
    Tout d'abord, merci de me répondre !

    Donc j'ai pris en compte et modifier la déclaration, mais ça ne s'affiche toujours pas ...

    je redonne mon code au cas ou :

    C_menu.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
     
    #ifndef C_MENU_H_INCLUDED
    #define C_MENU_H_INCLUDED
    #include <QtGui>
    class C_menu : public QMainWindow
    {
     Q_OBJECT
     public :
     
     C_menu();
     
    public slots:
       void OuvrirScore();
    };
     
     
    #endif // C_MENU_H_INCLUDED
    C_menu.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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include "C_menu.h"
     
    C_menu::C_menu()
    {
     
    QMenu *menuPacman = menuBar()->addMenu("&Fichier");
    QAction *beginaction = menuPacman->addAction("&Jouer");
    QAction *scoreaction = menuPacman->addAction("&High-Score");
    //QAction *helpaction = menuPacman->addAction("&Aide");
    //QAction *quitteraction = menuPacman->addAction("&Quitter");
     connect(beginaction, SIGNAL(triggered()), qApp, SLOT(quit()));
     connect(scoreaction, SIGNAL(clicked()), this, SLOT(OuvrirScore()));
     
     
    //Définition taille fenetre
    this->setFixedSize(640,480);
    //Définition nom de la fenetre
    this->setWindowTitle("Nom de la compagnie - Pacman V 1.0");
    //this->AfficherFile();
     
     
     
    }
     
    void C_menu::OuvrirScore()
    {
    QWidget *zoneCentrale = new QWidget;
        QVBoxLayout *layout = new QVBoxLayout;
        QPushButton *test = new QPushButton(tr("Quit"));
     
    layout->addWidget(test);
     
         zoneCentrale->setLayout(layout);
     setCentralWidget(zoneCentrale);
     
       /* QVBoxLayout *layout = new QVBoxLayout;
        QPushButton *test = new QPushButton(tr("Quit"));
    layout->addWidget(test);
     
         setLayout(layout);*/
    }
    Donc quand je clique sur High-Score ça affiche toujours rien
    Paye Tes Dettes - Applciation android.

    DevHackSecure - Pense bête d'un étudiant en informatique - Tutos DEV

    " I also realize that _everybody_ thinks that they are right, and that they are supported by all other right-thinking people. That's just how people work. We all think we're better than average." Linus Torvalds

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Salut,

    Pour une QAction le signal que tu dois utiliser est "triggered()" (ce que tu as d'ailleurs mis pour l'action d'au dessus) et non "clicked()", regarde la doc ça peut aider .

    Sinon pour ce genre d'erreur, lors du Debug, si tu exécutes ton appli dans une console tu peux ajouter la ligne suivant à ton .pro:De ce fait la console ne rendra la main qu'à la fin de l'exécution et tu auras tous les messages (erreur/warning/debug/...) affichés dans la console, par exemple dans ton cas tu aurais eu:
    Object::connect: No such signal QAction::clicked() in <tonFichier>.cpp:<numéro de ligne>
    Et donc tu aurais pu investiguer plus facilement.
    Tu pourras d'ailleurs aussi, en mettant le bon include ("#include <QtCore/QDebug>") afficher des infos dans la console avec par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = 123;
    qDebug() << "valeur de i :" << i;
    Autre remarque: dans ta fonction OuvrirScore() tu recrées à chaque fois un layout, bouton, etc... quand tu cliques sur "Fichier" "High-Score" Pour que ce soit plus propre tu devrais rajouter une variable de classe, et ne créer le widget qu'une fois, pour ce faire, ajoute dans ton .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
      QWidget m_ouvrirScoreWidget;
    Dans ton .cpp modifie ton constructeur pour initialiser cette variable à NULL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C_menu::C_menu()
    :m_ouvrirScoreWidget(NULL)
    {
    ... 
    }
    Et ta fonction OuvrirScore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void C_menu::OuvrirScore()
    {
    	if (m_ouvrirScoreWidget == NULL)
    	{
    		m_ouvrirScoreWidget = new QWidget;
    		QVBoxLayout *layout = new QVBoxLayout;
    		QPushButton *test = new QPushButton(tr("Quit"));
     
    		layout->addWidget(test);
     
    		m_ouvrirScoreWidget->setLayout(layout);
    	}
    	setCentralWidget(m_ouvrirScoreWidget);
    }
    Tu peux aussi utiliser la méthode que tu as en commentaire (avec simplement un layout que tu set directement à ton C_menu), en déclarant un QVBoxLayout en variable de classe plutôt qu'un QWidget.

    Voilà tout.
    G.

Discussions similaires

  1. Problème ouverture nouvelle fenêtre
    Par kewti dans le forum Général Java
    Réponses: 2
    Dernier message: 16/06/2014, 15h51
  2. [Débutant] Problème ouverture du fenêtre
    Par ralacorn dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 28/03/2013, 22h57
  3. Problème ouverture fenêtres
    Par hypnostick dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 07/11/2012, 13h39
  4. Problème ouverture de fenêtre
    Par shawn12 dans le forum MFC
    Réponses: 4
    Dernier message: 23/01/2008, 15h50
  5. [MFC] problème ouverture de fenêtre
    Par pytpyt dans le forum MFC
    Réponses: 1
    Dernier message: 19/04/2006, 14h05

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