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 de passage à Qt 4.7 avec une QGraphicsScene contenant de l'OpenGL


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut Problème de passage à Qt 4.7 avec une QGraphicsScene contenant de l'OpenGL
    Bonjour à tous,
    J'ai développé il y a quelque temps une appli, en m'inspirant de la demo boxes de qt, avec du contenu opengl mélangé avec des qwigets avec qt 4.5.3 :

    Lors du passage à qt 4.7 (et 4.6) L'opengl n'est plus affiché et les qwidgets perdent leur bordures :

    J'ai recréé ma façon de faire dans un petit morceau de code :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <QtGui/QApplication>
    #include <QGraphicsScene>
    #include <QGLWidget>
    #include <QDialog>
    #include <QGraphicsProxyWidget>
    #include <QGraphicsView>
    #include <QPainter>
    class my_scene : public QGraphicsScene
    {
     
    public:
        explicit my_scene(QObject *parent = 0) :
                QGraphicsScene
            (parent)
            {
                QDialog *widget = new QDialog;
                widget->resize(50,50);
                QGraphicsProxyWidget *widgetp = new QGraphicsProxyWidget();
                widgetp->setWidget(widget);
                widgetp->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
                addItem(widgetp);
            }
        void drawBackground(QPainter *painter, const QRectF &rect){
     
                painter->beginNativePainting(); //>= 4.6 only
                glClearColor(0.4,0.4,0.4,1.);
                glClear(GL_COLOR_BUFFER_BIT);
                glViewport(0, 0, painter->device()->width(),painter->device()->height());
                glMatrixMode(GL_PROJECTION);
                glPushMatrix();
                glLoadIdentity();
                glMatrixMode(GL_MODELVIEW);
                glPushMatrix();
                glLoadIdentity();
                glOrtho(-1.0,1.0,-1.0,1.0,-50,50);
                glMatrixMode(GL_MODELVIEW);
                glColor3f(1.,0.,0.);
                glBegin(GL_LINES);
                    glVertex2f(-1.0,0.0);
                    glVertex2f(1.0,0.0);
                glEnd();
                glPopMatrix();
                glMatrixMode(GL_PROJECTION);
                glPopMatrix();
                painter->endNativePainting(); //>= 4.6 only
     
                painter->setPen(Qt::blue);
                painter->drawLine(0,0,200,200);
            }
    };
     
    class Widget : public QGraphicsView
    {
     
     
    public:
        Widget(QWidget *parent = 0) :
                QGraphicsView(parent)
            {
                QGLWidget *widget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
                widget->makeCurrent();
                my_scene *s = new my_scene;
                setViewport(widget);
                setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
                setScene(s);
                resize(200,200);
            }
    };
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
     
        return a.exec();
    }
    Dans ce cas l'opengl (la ligne rouge) est traité correctement ce qui me laisse un peu d'espoir pour trouver une solution à mon problème d'affichage mais par contre l'habillage de fenêtre disparait lorsque je le compile et exécute avec qt 4.7 :

    Avec 4.5.3 cela marche:


    Est ce que quel qu'un sais d'où cela peut -il venir? Qu'est ce qui a changé dans qt?

    Merci,

    Sébastien

  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


    Je suis loin d'être pro dans l'utilisation d'OpenGL, il me semble que ce tuto pourrait t'aider : http://fhalgand.developpez.com/tutor...e-application/ (il est prévu pour Qt 4.6/4.7).
    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
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 128
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Il se peut que se soit un problème du coté d'OpenGL simplement. On peut "vérifier" le code OpenGL avec des glGetError().
    Dans le genre d'erreurs auxquelles je pense, c'est:
    - Initialisation dans un ordre incorrect (entre la fenêtre et OpenGL, ou entre les éléments d'OpenGL )
    - Les textures ? (mais il ne semble pas que celui soit le cas)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    Merci pour le tuto dourouc05, mais je n'utilise pas un QGLWidget directement, car j'ai besoin d'inclure des fenêtres interactives dans ma vue 3D.

    LittleWhite, glgetError me retourne 0, soit pas d'erreur. C'est vraiment le rendu des fêntetres qui reste problématique.

  5. #5
    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
    Bonjour szebos

    C'est original de mettre un QDialog dans ton code. Si tu mets un QPushButton, il s'affiche sans problème.

    C'est uniquement dans le code exemple que tu utilises un QDialog je suppose ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    Bonjour gbdivers,

    L'utilisation de QDialog est historique, dans une première version je les utilisaient car, en 4.5.3, on pouvait les utiliser sans passer par un QGraphicsProxyWidget.

    En utilisant à la place d'un QDialog, un QPushButton, j'ai un bouton fonctionnel, mais je n'ai pas les bordures qui me permettent de la déplacer et de le redimensionner.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/04/2007, 16h06
  2. Réponses: 6
    Dernier message: 03/04/2006, 09h42
  3. Problème avec une TImageList contenant des grandes images
    Par Manopower dans le forum Composants VCL
    Réponses: 8
    Dernier message: 17/11/2005, 15h20
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Réponses: 11
    Dernier message: 28/12/2004, 16h15

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