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 :

Problème de gestion du widget central

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut Problème de gestion du widget central
    Bonjour tous le monde.
    ca va faire maintenant un semaine que je galere avec ce probleme. je vous explique: je posséde une QMainwindow() que j'appele fenetrePrincipale, dans la centraleWidget je veux mettre Widget1 et en cliquant sur un icone, je met un widget correspondant dans la centraleWidget. donc vue le nombre de widget qui serais manipulé et aprés une longue recherche j'ai trouvé que QStackedWidget est la fonction recherché. Bref, je ne suis pas encore arrivé a manipuler plusieur widget, je suis encore tout au début. En effet, mon Widget1 qui sera le premier affiché dans la centralWidget, est créé a partir de deux class la premiere herite d'un QGraphicsObject et la seconde du QGraphicsView le tout pour créer une sorte de menu ou on voie 6 icones(c'est l'exemple padNavigator de Qt que j'ai un peu modifier mais en gros c le meme) . Juske la tous va bien, mainteant, aprés avoir mis le widget1 dans la centralWidget, je veux que si on clik sur les icones on met un widget approprié dans la centralWidget et c'est la que ca se complique.

    ma fenetrePrincipale
    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
     
    /************fenetrePrincipale.h*******************/
     
    class fenetrePrincipale : public QMainWindow
    {
        Q_OBJECT
     
    public:
        fenetrePrincipale(QWidget *parent = 0);
        ~fenetrePrincipale();
     
        static QStackedWidget *stackedWidget0 ;
     
    private:
     
        void createDockWindows();
     
    };
    /***********fenetrePrincipale.cpp*****************/
    QStackedWidget *stackedWidget0 =new QStackedWidget();
     
    fenetrePrincipale::fenetrePrincipale(QWidget *parent)         //QWidget *parent
        : QMainWindow(parent)
    {
     
        createDockWindows();
        menuClassic *mywidg = new menuClassic();
        testGL1 *mywid = new testGL1();
     
     
        ::stackedWidget0->addWidget(mywidg);
        ::stackedWidget0->addWidget(mywid);
        setCentralWidget(::stackedWidget0);  // dans la fenetre centrale
    }
     
     
    fenetrePrincipale::~fenetrePrincipale()
    {
    }
     
    void roundRectItem::mousePressEvent(QGraphicsSceneMouseEvent * Mousevent)
    {
     
        if(Mousevent->button() == Qt::LeftButton)
             {
            update();
            ::stackedWidget0->setCurrentIndex(0);
              }
    }
    Mon Widget1 qui represente le menu avec les icones t qui est créé a partir de deux classes et voici leurs headers:

    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
     
    /************roundRectItem.h*********/
    #include <QGraphicsObject>
    #include <QLinearGradient>
     
    class roundRectItem:public QGraphicsObject
    {
        Q_OBJECT
        Q_PROPERTY(bool fill READ fill WRITE setFill)
     
    public:
        roundRectItem(const QRectF &bounds, const QColor &color,
                      QGraphicsItem *parent = 0);
    //.... le reste ne nous interesse pas :)
    }
     
    /*************menuClassic.h********/
     
    class menuClassic : public QGraphicsView
    {
        Q_OBJECT
    public:
        explicit menuClassic(QWidget *parent = 0);
        roundRectItem *buttonAt(int column, int row) const;
        QVector<QVector<roundRectItem *> > buttonGrid;
     
    protected:
        void resizeEvent(QResizeEvent *event);
    }
    Donc voila mon probleme, et plus précisement ici dans fenetrePrincipale.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void roundRectItem::mousePressEvent(QGraphicsSceneMouseEvent * Mousevent)
    {
     
        if(Mousevent->button() == Qt::LeftButton)
             {
             ::stackedWidget0->setCurrentIndex(0);
     
              }
     
    }
    je sais que c'est précisément ici que ca coince. en fait si je remplace cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ::stackedWidget0->setCurrentIndex(0);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if(Mousevent->button() == Qt::LeftButton)
             {
                 QWidget *unWidgetVide= new QWidget;
                 unWidgetVide->show;
           }
    ca ouvre une fenetre de dialogue, c'est pas ce que je veux mais ca prouve au moins que je récupére le click sur les icones donc le probleme n'est pas ds la création de Widget1.
    par contre si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     if(Mousevent->button() == Qt::LeftButton)
             {
                 QWidget *unWidgetVide= new QWidget;
                 fenetrePrincipale *f; // parce qu'on est pas dans la class fenetrePrincipale 
                f->setCentraleWidget(unWidgetVide);
            }
    ici ca beugue, aucun résultat.
    donc voila mon probleme j'arrive pas a afficher un Widget simple dans la centralWidget.
    J'espere que j'ai été tres claire, et j'attend vos réponse avec impatience. Merci d'avance.

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

    Le problème vient du fait que tu n'initialises pas ta variable f
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if(Mousevent->button() == Qt::LeftButton)
    {
        QWidget *unWidgetVide= new QWidget;
        fenetrePrincipale *f  = new fenetrePrincipale(); // parce qu'on est pas dans la class fenetrePrincipale 
        f->setCentralWidget(unWidgetVide);
    }
    Cependant cela me semble bizarre que tu crées une fenetrePrincipale à chaque clic

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    bonsoir et merci de ta réponse.
    en fait j'ai essayé tous les cas de figure pour instancier une fenetrePrincipale et ca a tjrs bugger , mais ta raison, c un peu bizarre de créer a chaque fois la fenetrePrincipale. je le fais en fait parske j'ai pas trouvé un moyen d'appeler setCentraleWidget() a partir de classes a part ou je crée mes Widgets et ou je fais appèle a moussPressEvent(). j'ai éssayé de passer par des QStackedWidget où je stocke mes widgets créés a partir d'autres classes differentes, la encore j'ai pas réussis. j'ai tenté de créer ma QStackedWidget en "static" vue ke je dois l'appelé dans plusieurs classes, ca na tjrs pas marché.

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Hello

    tout comme Winjerome j'ai un peu du mal de comprendre

    Quand tu dis fenêtrePrincipale et que tu mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void roundRectItem::mousePressEvent(QGraphicsSceneMouseEvent * Mousevent)
    tu n'est pas au bon endroit bref pourquoi pour ce simplifier la tache tu ne passerais pas le parent en paramètre ?? pour avoir ton fenetrePrincipale à l'endroit que tu souhaite

    sinon ton menuClassic (drôle de nom) hérite d'un QGraphicsView

    tu peux depuis cet endroit qui est ta scène récupérer les événements souris clique etc ... ensuite tu dois appeler la "même méthode parente" ex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void menuClassic::mousePressEvent(QMouseEvent *event)
    {
        QGraphicsView::mousePressEvent(event);
    }
    apres comme tu a une liste des QGraphicsObject (QGraphicsItem est mieux) tu leur ajoute un flag (http://qt.developpez.com/doc/latest/...m.html#setFlag) en parcourant ton vecteur tu peux tester qui est selectionné avec isSelected (http://qt.developpez.com/doc/latest/...tml#isSelected) après s'il y en a un sélectionné bas tu fais ce que tu veux

    ps : je pense que tu devrais jeter un coup d'œil ici (http://qt.developpez.com/doc/latest/qgraphicsscene.html et http://qt.developpez.com/doc/latest/...#selectedItems) ca serait beaucoup plus simple

    sinon j'espère t'avoir aidé (ca fais longtemps que j'ai plus fais ca )

    bonne chance

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    bonjour et merci,
    quand tu dis:
    ""tu n'est pas au bon endroit bref pourquoi pour ce simplifier la tache tu ne passerais pas le parent en paramètre ?? pour avoir ton fenetrePrincipale à l'endroit que tu souhaite""
    tu peux me donner un exemple stp.

    "" tu peux depuis cet endroit qui est ta scène récupérer les événements souris clique etc ... ensuite tu dois appeler la "même méthode parente" ex ""
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void menuClassic::mousePressEvent(QMouseEvent *event)
    {
        QGraphicsView::mousePressEvent(event);
    }
    tu peux stp me donner plus de détail, parske je vois pas comment je vais utiliser le clik sur les items a partir de la.

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Citation Envoyé par simo113 Voir le message
    bonjour et merci,
    quand tu dis:
    ""tu n'est pas au bon endroit bref pourquoi pour ce simplifier la tache tu ne passerais pas le parent en paramètre ?? pour avoir ton fenetrePrincipale à l'endroit que tu souhaite""
    tu peux me donner un exemple stp.
    Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class fenetrePrincipale;
    class menuClassic : public QGraphicsView
    {
        Q_OBJECT
    public:
        explicit menuClassic(fenetrePrincipale *parent = 0);
    ...
    private:
        fenetrePrincipale *parent;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "fenetreprincipale."
    void menuClassic::maMethode()
    {
        parent->maMethodeDeLaClassFenetrePrincipale();
    }
    Citation Envoyé par simo113 Voir le message

    "" tu peux depuis cet endroit qui est ta scène récupérer les événements souris clique etc ... ensuite tu dois appeler la "même méthode parente" ex ""
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void menuClassic::mousePressEvent(QMouseEvent *event)
    {
        QGraphicsView::mousePressEvent(event);
    }
    tu peux stp me donner plus de détail, parske je vois pas comment je vais utiliser le clik sur les items a partir de la.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void menuClassic::mousePressEvent(QMouseEvent *event)
    {
        QGraphicsView::mousePressEvent(event);
        for (int i = 0; i < buttonGrid->sie() ; i++)
       {
           if (buttonGrid->(at)->isSelected ()) parent->maMethodeDeLaClassFenetrePrincipale();
       }
    }
    je pensais à un truc du style mais je réitère ce que j'ai dit avant "je pense que tu devrais jeter un coup d'œil ici (http://qt.developpez.com/doc/latest/qgraphicsscene.html et http://qt.developpez.com/doc/latest/...#selectedItems) ca serait beaucoup plus simple"

    Après je pense (mon avis) que la structure de ton appli est trop complexe pour réaliser cela ...

    bonne continuation

Discussions similaires

  1. Problème Création/Gestion Widget
    Par Jazys dans le forum Android
    Réponses: 0
    Dernier message: 28/07/2011, 17h23
  2. Problème de gestion d'un octree
    Par MaxPayne dans le forum OpenGL
    Réponses: 9
    Dernier message: 06/04/2005, 10h17
  3. problème de gestion de fenêtre
    Par clemsouz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/11/2004, 14h35
  4. Problème de gestion fichiers
    Par glutock dans le forum ASP
    Réponses: 2
    Dernier message: 08/04/2004, 11h55
  5. [TFrame] Problème de gestion du OnMouseDown avec une Frame
    Par xherault dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/05/2003, 15h35

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