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 :

Affichage d'objets dans une scène [Graphics View]


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Affichage d'objets dans une scène
    Bonjour à tous,

    J'ai fait le code de test que voici qui fonctionne comme je le souhaite

    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 <QApplication>
    #include <QtWidgets>
     
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
     
    	QMainWindow *window = new QMainWindow();
     
    	// on met en place la gestion des fenetres multiples
    	QMdiArea *mdiArea = new QMdiArea;
    	mdiArea->setViewMode(QMdiArea::SubWindowView);
    	window->setCentralWidget(mdiArea);
     
    	// On met en place la sous fenetre
    	QMdiSubWindow *subWindow = new QMdiSubWindow();
    	subWindow->setWindowState(Qt::WindowMaximized);
    	mdiArea->addSubWindow(subWindow, Qt::SubWindow);
     
    	// On met en place un objet quelconque histoire d'afficher quelque chose
    	QPushButton *bouton = new QPushButton("Mon bouton entre en scene !");
    	QGraphicsScene scene;
    	QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget();
    	proxy->setWidget(bouton);
    	scene.setSceneRect(-150, -150, 300, 300);
     
    	// On met en place la scene à afficher dans la vue
    	scene.addItem(proxy);
     
    	// On teste différent traitement
    //	proxy->setPos(200, 150);	// On bouge
    //	proxy->setRotation(45);		// On rotationne ;)
    //	proxy->setScale(2);			// On zoome
     
    	QGraphicsView view(&scene);
    	subWindow->setWidget(&view);
     
    	window->show();
     
    	return app.exec();
    }
    Puis j'ai reporté ce code dans un projet un peut plus abouti.
    Et là cela ne fonctionne plus.
    Ca m'affiche bien ma QMdiSubWindow mais vide.

    Je galère depuis plusieurs jours la dessus.
    Est ce que quelqu'un peut me dire ce que je fait mal ?

    le .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
     
    #ifndef TESTGRAPHICS_H
    #define TESTGRAPHICS_H
     
    #include <QMainWindow>
    #include "ui_TestGraphics.h"
     
     
    class TestGraphics : public QMainWindow
    {
    	Q_OBJECT
     
    public:
    	TestGraphics(QWidget *parent = Q_NULLPTR);
    	~TestGraphics();
     
    private:
    	Ui::TestGraphicsClass *ui;
    };
     
    #endif // !TESTGRAPHICS_H
    Le .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
    44
    45
     
    #include "TestGraphics.h"
    #include <QtWidgets>
     
     
    TestGraphics::TestGraphics(QWidget *parent) : QMainWindow(parent), ui(new Ui::TestGraphicsClass)
    {
    	ui->setupUi(this);
     
    	// on met en place la gestion des fenetres multiples
    	QMdiArea *mdiArea = new QMdiArea;
    	mdiArea->setViewMode(QMdiArea::SubWindowView);
    	setCentralWidget(mdiArea);
     
    	// On met en place la sous fenetre
    	QMdiSubWindow *subWindow = new QMdiSubWindow();
    	mdiArea->addSubWindow(subWindow, Qt::SubWindow);
    	subWindow->setWindowState(Qt::WindowMaximized);
     
    	// On met en place un objet quelconque histoire d'afficher quelque chose
    	QPushButton *bouton = new QPushButton("Mon bouton entre en scene !");
    	QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget();
    	proxy->setWidget(bouton);
     
    	// On met en place la scene à afficher dans la vue
    	QGraphicsScene scene;
    	scene.setSceneRect(-150, -150, 300, 300);
    	scene.addItem(proxy);
     
    	// On teste différent traitement
    //	proxy->setPos(200, 150);
    //	proxy->setRotation(45);
    //	proxy->setScale(2);
     
     
    	QGraphicsView view(&scene);
     
    	subWindow->setWidget(&view);
    //	view.show();
     
    }
     
    TestGraphics::~TestGraphics() {
    	delete ui;
    }
    Merci d'avance pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Vous créez la scène (QGraphicsScene) ainsi que la vue (QGraphicsView) sur la pile, elle seront donc détruites à la sortie du constructeur de TestGraphics. Je pense que c'est ça qui pose problème.

    Donc il faudrait plutôt écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
      QGraphicsScene *scene = new QGraphicsScene;
      ...
      QGraphicsView *view = new QGraphicsView(scene);
      subWindow->setWidget(view);
    Edit: Cela fonctionnait précédemment car vous étiez dans le main, du coup les instances de "scene" et "view" n'était pas détruite avant la fin de l'exécution du programme, ce qui n'est plus le cas lorsque vous être dans une fonction, en l'occurrence ici dans le constructeur de la classe TestGraphics.
    Il serait encore mieux de garder ces pointeurs en tant que variables membres de la classe TestGraphics en cas de besoin d'accès ultérieur, ce qui devrait être le cas.

    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
    //testgraphics.h
    class TestGraphics{
        ...
    private:
    QGraphicsScene *m_scene;
    QGraphicsView *m_view;
       ...
    };
     
    //testgraphics.cpp
    TestGraphics::TestGraphics(QWidget *parent) : QMainWindow(parent), ui(new Ui::TestGraphicsClass)
    {
    ...
      m_scene = new QGraphicsScene;
      ...
      m_view = new QGraphicsView(m_scene);
      subWindow->setWidget(m_view);
    }

    [/CODE]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Effectivement, c'est ça

    Je suis vraiment fatigué en ce moment.

    Merci beaucoup pour le coup de main

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

Discussions similaires

  1. Irrlicht 3D : Mouvement d'objets dans une scène
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 22/04/2013, 20h12
  2. Orientation d'un objet dans une scène
    Par azboul dans le forum Mathématiques
    Réponses: 9
    Dernier message: 07/10/2010, 20h16
  3. Réponses: 1
    Dernier message: 21/10/2009, 15h21
  4. fixer un objet dans une scène en rotation
    Par amine84 dans le forum 3D
    Réponses: 1
    Dernier message: 30/08/2009, 03h39
  5. Réponses: 10
    Dernier message: 12/05/2008, 18h10

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