Strumenti Utente



tutorial_qt:opengl_01bis

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisione Revisione precedente
Prossima revisione
Revisione precedente
tutorial_qt:opengl_01bis [2015/01/21 06:34]
mickele [Riassunto finale!]
tutorial_qt:opengl_01bis [2015/05/05 14:43] (versione attuale)
mickele
Linea 1: Linea 1:
-====== Qt5 Opengl #1bis ======+====== Qt OpenGL - Intro alla classe QOpenGLWidget ======
  
-Nel primo tutorial su Qt5 e le Opengl abbiamo visto come utilizzare la nuova infrastruttura Opengl introdotta nelle Qt5. Abbiamo lavorato in particolare con la classe QWindow, essendo la precedente classe QGLWidget ormai obsoleta e non essendo disponibile nelle prime release delle Qt5 niente di analogo. Questo è stato vero fino alla versione 5.4 con cui finalmente la vecchia QGLWidget è stata aggiornata alla nuova infrastruttura, diventando QOpenGLWidget.+Nel [[tutorial_qt:opengl_01|precedente articolo su Qt5 e le Opengl]] abbiamo cominciato a vedere come utilizzare la nuova infrastruttura Opengl introdotta nelle Qt5 derivando dalla classe QWindow. Abbiamo anche evidenziato che la classe QGLWidget già presente nelle Qt4, benché ancora presente in Qt5, è stata dichiarata obsoleta, senza che ne venisse fornito un vero e proprio sostituto. Questo è stato vero fino alla versione 5.4 con cui finalmente la vecchia QGLWidget è stata aggiornata alla nuova infrastruttura, diventando QOpenGLWidget.
  
 ===== Quando usare QWindow e quando QOpenGLWidget ===== ===== Quando usare QWindow e quando QOpenGLWidget =====
  
-QOpenGLWidget deriva da QWidget, quindi se abbiamo realizzato la nostra interfaccia usando oggetti derivati da QWidget, ci sarà più comodo usare QOpenGLWidget che potrà essere inserito direttamente nel layout come qualsiasi altro QWidget. Al contrario, se invece non abbiamo bisogno di QWidget, ad esempio perché stiamo lavorando con QtQuick, allora preferiremo utilizzare QWindow.+QOpenGLWidget deriva da QWidget, quindi se abbiamo realizzato la nostra interfaccia usando oggetti derivati da QWidget, ci sarà più comodo usare QOpenGLWidget che potrà essere inserito direttamente nel layout come qualsiasi altro QWidget. Se invece non abbiamo bisogno di QWidget, ad esempio perché stiamo lavorando con QtQuick, allora preferiremo QWindow. 
 + 
 +~~READMORE~~
  
 In realtà tale distinzione nasce semplicemente da motivi di comodità, perché è comunque possibile inserire una QWindow all'interno di un QWidget, utilizzando il metodo QWidget::createWindowContainer(), scrivendo qualcosa del tipo In realtà tale distinzione nasce semplicemente da motivi di comodità, perché è comunque possibile inserire una QWindow all'interno di un QWidget, utilizzando il metodo QWidget::createWindowContainer(), scrivendo qualcosa del tipo
Linea 14: Linea 16:
   container->setFocusPolicy(Qt::TabFocus);   container->setFocusPolicy(Qt::TabFocus);
  
-Per approfondire il metodo statico QWidget::createWindowContainer() vi rimando al [[http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/|relativo annuncio sul blog ufficiale delle Qt]].+Per approfondire il metodo statico QWidget::createWindowContainer() vi rimando al relativo [[http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/|annuncio sul blog ufficiale delle Qt]]. 
 + 
 +Vedremo però che l'impiego della classe QOpenGLWidget è decisamente più semplice, anche perché tale classe è pensata per agevolare la programmazione opengl, al contrario della classe QWindow che è più generica. 
 + 
 +===== Un esempio applicativo con QOpenGLWidget ===== 
 + 
 +Nel file di progetto è necessario attivare il modulo widgets 
 + 
 +  Qt += widgets
  
-Vedremo però che l'impiego della classe QOpenGLWidget è decisamente più semplice, anche perché tale classe è pensata per agevolare il programmatore nella programmazione Opengl, al contrario della classe QWindow che è più generica. +Chi viene dalle Qt4 noterà che non è più necessario il modulo opengl.
-===== Sporchiamoci le mani con QOpenGLWidget =====+
  
-Analogamente a quanto già accadeva con QGLWidget, sarà necessario derivare la classe QOpenGLWidget, implementando tre metodi virtuali:+Per quanto riguarda il codice C++, analogamente a quanto accadeva con QGLWidget, è necessario derivare la classe QOpenGLWidget, implementando tre metodi virtuali:
   * initializeGL()   * initializeGL()
   * resizeGL()   * resizeGL()
   * paintGL()   * paintGL()
  
-Partiamo con initializeGL(), che si occupa di inizializzare il nostro programma+Partiamo con initializeGL(), che si occupa di inizializzare le funzionalità opengl del programma
  
   void GLWidget::initializeGL() {   void GLWidget::initializeGL() {
Linea 30: Linea 39:
       m_program = new QOpenGLShaderProgram(this);       m_program = new QOpenGLShaderProgram(this);
      
-      // Compiliamo lo shader dei vertici+      // Compiliamo il vertex shader
       if (!m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex.glsl"))       if (!m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex.glsl"))
           close();           close();
Linea 42: Linea 51:
           close();           close();
      
-      // Attiviamo alcuni stati+      // Attiviamo alcuni stati opengl
       glEnable(GL_DEPTH_TEST);       glEnable(GL_DEPTH_TEST);
       glEnable(GL_BLEND);       glEnable(GL_BLEND);
Linea 59: Linea 68:
   }   }
  
-Ed infine il metodo paintGL(), che si occupa del disegno vero e proprio+Ed infine il metodo paintGL() si occupa del disegno vero e proprio
  
   void GLWidget::paintGL() {   void GLWidget::paintGL() {
Linea 97: Linea 106:
   }   }
  
-Se confrontiamo il codice appena scritto con quello necessario con la classe QWindow notiamo una decisa semplificazione, che nasce principalmente dalla maggiore specializzazione della classe QOpenGLWidget a questo tipo di impiego.+Otterremo così il seguente risultato
  
-===== Mescoliamo un po' le cose... =====+{{ :tutorial_qt:opengltut01bis-01.png | Il risultato del codice riportato nel paragrafo}}
  
-E' possibile disegnare oggetti grafici 2D con QPainter sul nostro Widget.+Se confrontiamo il codice appena scritto con [[[[tutorial_qt:opengl_01||quello necessario con la classe QWindow]] notiamo una decisa semplificazione, che nasce principalmente dalla maggiore specializzazione della classe QOpenGLWidget.
  
-In tal caso nel metodo paintGL() creiamo un oggetto QPainter. A questo punto i comandi opengl veri e propri dovranno essere compresi tra i metodi beginNativePainting() ed endNativePainting()Al di fuori di fuori di tali metodi è possibile utilizzare la classe QPainter come siamo abituati a fare di solito.+===== Mescoliamo le opengl con QPainter... =====
  
 +Con QOpenGLWidget, è possibile sovrapporre al disegno opengl altri oggetti grafici realizzati con la classe [[http://doc-snapshot.qt-project.org/qt5-5.4/qpainter.html|QPainter]].
 +
 +In tal caso nel metodo paintGL() inseriamo i comandi opengl tra i metodi beginNativePainting() ed endNativePainting() di un oggetto QPainter. Al di fuori di fuori di tali metodi utilizziamo la classe QPainter come siamo abituati a fare di solito.
  
   QPainter painter;   QPainter painter;
Linea 120: Linea 132:
   ...   ...
   painter.end();   painter.end();
-   
-===== Riassunto finale ===== 
  
-Abbiamo visto brevemente come utilizzare la classe QOpenGLWidget per creare oggetti derivati da QWidget su cui disegnare con le librerie Opengl. Al link [[http://ingegnerialibera.altervista.org/blog-file/opengltut01bis.zip|ingegnerialibera.altervista.org/blog-file/opengltut01bis.zip]] trovate il codice visto nell'articolo.+{{ :tutorial_qt:opengltut01bis-02.png |Un esempio di cosa si può fare mescolando comandi opengl alla classe QPainter}} 
 + 
 +Nell'usare tale tecnica bisgona tener conto di un dettaglio: ogni volta che creiamo QPainter, viene reimpostato il contesto opengl. Questo vuol dire che eventuali stati che sono stati impostati nel metodo initializeGL() vengono resettati. 
 + 
 +Al link [[http://ingegnerialibera.altervista.org/blog-file/opengltut01bis.zip|ingegnerialibera.altervista.org/blog-file/opengltut01bis.zip]] trovate un progetto riassuntivo di quanto visto nell'articolo. 
 + 
 +===== Potrebbero interessarti anche... =====
  
 +Un elenco degli altri articoli disponibili sull'argomento:
 +<blog related>
 +</blog>

tutorial_qt/opengl_01bis.1421818478.txt.gz · Ultima modifica: 2015/01/21 06:34 da mickele

Facebook Twitter Google+ Digg Reddit LinkedIn StumbleUpon Email