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 :

QGLWidget dans QWidget [2D/3D]


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Par défaut QGLWidget dans QWidget
    Bonjour à toute la communauté,
    j'essaie d inclure un contexte openGL QGLWidget dans un QWidget par parenté. Le contexte apparait seulement il est transparent voir la photo.
    Auriez vous une idée du pourquoi du comment?

    Si y a une partie du code que vous voulez voir dites moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main(int argc, char *argv[])
    {
    	QApplication a(argc, argv);
    	WIDGET_OpenGL w2;
    	WIDGET w3;
    	w3.show();
    	w2.setParent(&w3);
    	w2.show();
                 return a.exec()
    }
    Cordialement
    Images attachées Images attachées  

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Pouvez vous donner un peu plus de code (genre les classes, WIDGET et WIDGET_OpenGL), s'il vous plait.
    Sinon, vous pouvez regarder sur DVP il y a des tutos sur l'intégration d'OpenGL dans Qt
    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.

  3. #3
    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
    Indépendamment du problème de transparence, il n'est pas nécessaire de mettre deux fois "show" : show permet d'afficher le widget et ses enfants. un "w3.show();" après la création de tous les widgets est suffisant.

    De plus, en général, on place les widgets enfants dans des QLayout, pour qu'ils adaptent leurs tailles au parent (j'imagine que c'est pour l'exemple qu'il n'y en a pas ?)

    Pour le problème de transparence, ça doit effectivement venir du code des widgets. (ps : pourquoi des noms en majuscule ? ça peut porter confusion avec des noms de macros)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Par défaut
    voici
    le widget dans lequel le contexte opengl va etre integrer (WIDGET = WINDOW_BLEUNUIT ct pour faciliter la comprehension que j'avais ecrit ca.)

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    #include "WINDOW_BleuNuit.h"
    #include <QDesktopWidget>
    #include <QPainter>
     
    WINDOW_BleuNuit::WINDOW_BleuNuit(QWidget * parent)
    :QWidget(parent),
    m_MainLayout(this),
    m_TitleBar(this),
    m_SizeGrip(this),
    m_Cache(NULL),
    m_taille(QSize(512,512))
    {
    	connect(this, SIGNAL(WindowTitleChanged()),&m_TitleBar,SLOT(UpdateWindowTitle()));
     
    	resize(m_taille.width(),m_taille.height());
    	setWindowTitle(tr("test"));
    	setWindowFlags(Qt::FramelessWindowHint);
    	setAttribute(Qt::WA_TranslucentBackground);
     
    	/*MainLayout*/
    	m_MainLayout.setMargin(0);
    	m_MainLayout.setSpacing(0);
    	m_MainLayout.addWidget(&m_TitleBar,0,0,1,1);
    	m_MainLayout.setRowStretch(1,1);
     
    	setLayout(&m_MainLayout);
    }
    WINDOW_BleuNuit::WINDOW_BleuNuit(QString title,QWidget * parent)
    :QWidget(parent),
    m_MainLayout(this),
    m_TitleBar(this),
    m_SizeGrip(this),
    m_Cache(NULL),
    m_taille(QSize(512,512))
    {
    	connect(this		,SIGNAL(WindowTitleChanged())	,&m_TitleBar	,SLOT(UpdateWindowTitle()));
    	connect(&m_TitleBar	,SIGNAL(Signal_Quit())			,this			,SLOT(Quit()));
     
    	resize(m_taille.width(),m_taille.height());
    	setWindowTitle(title);
    	setWindowFlags(Qt::FramelessWindowHint);
    	setAttribute(Qt::WA_TranslucentBackground);
     
    	/*MainLayout*/
    	m_MainLayout.setMargin(0);
    	m_MainLayout.setSpacing(0);
    	m_MainLayout.addWidget(&m_TitleBar,0,0,1,1);
    	m_MainLayout.setRowStretch(1,1);
     
    	setLayout(&m_MainLayout);
    }
     
    WINDOW_BleuNuit::~WINDOW_BleuNuit()
    {
    	delete m_Cache;
    }
     
    void WINDOW_BleuNuit::Quit()
    {
    	close();
    }
     
     
    void WINDOW_BleuNuit::showEvent(QShowEvent *event)
    {
    	Q_UNUSED(event);
     
    	CenterOnScreen();
    }
     
    void WINDOW_BleuNuit::paintEvent(QPaintEvent *event)
    {
      Q_UNUSED(event);
     
      if(m_Cache != NULL)
      {
        QPainter painter(this);
     
        painter.drawPixmap(0, 0, *m_Cache);
      }
    }
     
    void WINDOW_BleuNuit::resizeEvent(QResizeEvent *event)
    {
      Q_UNUSED(event);
     
      if(m_Cache != NULL) delete m_Cache;
     
      m_Cache = new QPixmap(size());
     
      m_Cache->fill(Qt::transparent);
     
      QPainter painter(m_Cache);
     
      QColor darkBlue ( 23,  23,  34);
      QColor lightBlue(177, 177, 203);
     
      /********** Window's background **********/
      QPolygon background;
     
      background << QPoint(           0,            16)
                 << QPoint(          16,             0)
                 << QPoint(width() -  1,             0)
                 << QPoint(width() -  1, height() - 33)
                 << QPoint(width() - 17, height() - 17)
                 << QPoint(         272, height() - 17)
                 << QPoint(         256, height() -  1)
                 << QPoint(          16, height() -  1)
                 << QPoint(          16,           272)
                 << QPoint(           0,           256);
     
      painter.setPen  (QPen  (darkBlue));
      painter.setBrush(QBrush(darkBlue));
     
      painter.drawPolygon(background);
      /*****************************************/
     
      /********** Window's frame **********/
      QPolygon frame;
     
      frame << QPoint(           4,            20)
            << QPoint(          20,             4)
            << QPoint(width() -  4,             4)
            << QPoint(width() -  4, height() - 37)
            << QPoint(width() - 20, height() - 21)
            << QPoint(         268, height() - 21)
            << QPoint(         252, height() -  5)
            << QPoint(          20, height() -  5)
            << QPoint(          20,           268)
            << QPoint(           4,           252);
     
      painter.setPen  (QPen(lightBlue));
      painter.setBrush(Qt::NoBrush    );
     
      painter.drawPolygon(frame);
      /*****************************************/
     
      m_SizeGrip.move  (width() - 32, height() - 49);
      m_SizeGrip.resize(          32,            32);
    }
     
     
    void WINDOW_BleuNuit::setWindowTitle(const QString &title)
    {
    	QWidget::setWindowTitle(title);
     
    	emit WindowTitleChanged();
    }
     
    void WINDOW_BleuNuit::CenterOnScreen()
    {
      QDesktopWidget screen;
     
      QRect screenGeom = screen.screenGeometry(this);
     
      int screenCenterX = screenGeom.center().x();
      int screenCenterY = screenGeom.center().y();
     
      move(screenCenterX - width () / 2,
           screenCenterY - height() / 2);
    }

    et voici le contexte openGL

    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 "OpenGL_Manager.h"
    #include "WIDGET_OpenGL.h"
     
    #ifndef GL_MULTISAMPLE
    #define GL_MULTISAMPLE  0x809D
    #endif
     
    using namespace OPENGL_OUTILS;
     
    namespace WIDGET
    {
     
    	WIDGET_OpenGL::WIDGET_OpenGL(QSize min,QSize max,QWidget *parent)
    	:QGLWidget(parent),
    	 minSize(min),
    	 maxSize(max)
    	{
    	}
     
    	WIDGET_OpenGL::~WIDGET_OpenGL(void)
    	{
    	}
     
    	QSize WIDGET_OpenGL::minimumSizeHint() const
    	{
    		return minSize;
    	}
     
    	QSize WIDGET_OpenGL::sizeHint() const
    	{
    		return maxSize;
    	}
     
    	void WIDGET_OpenGL::initializeGL()
    	{
    		OpenGL_Manager openGL;
    		openGL.initialiseOpenGL();
    	}
     
    	void WIDGET_OpenGL::paintGL()
    	{
    	}
     
    }//namespace
    et effectivement je ne l'ai pas encore placé dans un layout.
    En ce qui concerne QtOpenGL je m'en sers depuis quelque temps j'ai deja reussi a utilisé le QGLWidget de base, mais la je voulais l'integrer dans une fenetre customisé et ca ne fonctionne pas, alors que sans ca fonctionne.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Par défaut
    Donc j'ai reussi a identifier le probleme , mais je n'en connais pas les raisons.

    Pourquoi un GLWidget ne peut pas etre parenté à un Widget comportant "setAttribute(Qt::WA_TranslucentBackground)"?

    Y a t il une solution pour palier a mon probleme ?

    (reponse au ps ... je comprend le fait de pouvoir confondre les nom de classe en majuscule et les macro, pour moi la partie en majuscule correspond à mon namespace , comme j utilise using namespace, la partie correspondant a mon namespace disparait, du coup avec les differents Manager que je suis en train de créer à coté je m y perd un peu sans ca, est-ce-que ce que je fait est incorrect ???)

  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
    Bonjour

    Je pense que le problème provient d'un problème de propagation du style d'arrière plan entre le widget parent et le widget OpenGL.

    Dans la doc de QWidget, il est précisé que le style WA_TranslucentBackground se propage à l'enfant. Il faut donc probablement préciser dans le constructeur de QGLWidget que tu redessines le widget :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setAttribute(Qt::WA_OpaquePaintEvent);
    (reponse au ps ... je comprend le fait de pouvoir confondre les nom de classe en majuscule et les macro, pour moi la partie en majuscule correspond à mon namespace , comme j utilise using namespace, la partie correspondant a mon namespace disparait, du coup avec les differents Manager que je suis en train de créer à coté je m y perd un peu sans ca, est-ce-que ce que je fait est incorrect ???)
    Si le code est uniquement pour toi, ce n'est pas dramatique (bien que je pense que même pour les projets personnels, c'est une bonne habitude de faire "comme si" on travailler en équipe)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Par défaut
    Reponse Exact ! merci beaucoup gbDivers pour cette réponse et ces conseils.

    Sujet Résolu

    A bientot tout le monde.

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

Discussions similaires

  1. [2D/3D] QGLWidget dans une fenêtre avec QGridLayout
    Par Einde dans le forum Débuter
    Réponses: 2
    Dernier message: 21/04/2015, 07h54
  2. QWidget dans QMainWindow
    Par h2g2_42 dans le forum Qt
    Réponses: 1
    Dernier message: 28/10/2009, 00h43
  3. ajouter QGraphicsView dans QWidget
    Par bracket dans le forum Débuter
    Réponses: 5
    Dernier message: 09/06/2009, 09h24
  4. QToolbar dans un QWidget, placée en bas !
    Par doof dans le forum Qt
    Réponses: 9
    Dernier message: 15/01/2009, 17h47

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