Ceci est une ancienne révision du document !
Le support d’OpenGL dans Qt 5 a été modifié pour mieux l’intégrer avec les nouveaux modules de Qt : QtQuick2 et Qt3D. Cet article présente les modifications apportées dans Qt 5.
Dans Qt 4, les fonctionnalités d’OpenGL sont implémentées dans un module spécifique, QtOpenGL. Ce module était utilisé par différentes classes pour bénéficier de l’accélération matérielle. Il existe plusieurs méthodes pour activer l’accélération matérielle :
QApplication::setGraphicsSystem(“opengl”)
, dans la fonction main
par exemple ;QGraphicsView
(QtGraphics) ou QDeclarativeView
(QtQuick), utilisez la fonction setViewport(new QGLWidget)
;QPainter
directement sur un QGLWidget
, qui est une classe dérivée de QWidget
avec un contexte OpenGL ;Dans Qt 4, le support d'OpenGL était donc optionnel, dans un module dédié. Il fallait créer spécifiquement un contexte OpenGL et le passer en paramétré pour bénéficier de l’accélération matérielle.
Dans Qt 5, l'objectif a été de fournir un support minimal d'OpenGL dans QtGui, ce qui permet de l'utiliser dans tous les modules graphiques (widgets, Qt Quick) qui dependent de QtGui. L
C’est pour cela que de nouvelles classes font leur apparition dans Qt5 et que les différents modules ont été réorganisés :
QOpenGLXxx
appartiennent au module QtGui et fournissent les fonctionnalités de base permettant l’accélération matérielle pour toute les classes de rendu de Qt ;QWidget
n’est plus le parent de toutes les classes de rendu. Cette classe et ses dérivées (QGraphicsView
par exemple) sont transférées dans le module “widgets” ;QWidget
, la classe QDeclarativeView
devient QQuickView
et OpenGL est utilisé par défaut ;QGLWidget
et ses dérivés (les classes qui commencent par QGLXxx
). Ce module permet de conserver le code Qt 4 compatible avec Qt 5, mais ces classes sont dépréciées au profit des classes QOpenGLXxx
.
Remarque : il faut faire attention de ne pas confondre le module QtOpenGL, contenant les classes commençant par QGLXxx
, et le module QtGui, contenant les classes commençant par QOpenGLXxx
(sans t).
Le module QtGui de Qt5 réutilise des classes existantes du module QtOpenGL de Qt4. Les noms sont explicites :
Plusieurs nouvelles classes font leur apparition :
La procédure d'installation ci-dessous concerne les anciennes versions de Ubuntu
Tout d’abord, il faut Qt5. Le plus simple est d’utiliser les dépôts PPA sur Ubuntu : https://launchpad.net/~forumnokia/+archive/fn-ppa. Qt5 sera installé dans le répertoire /opt/qt5. Pour ajouter cette version de Qt dans QtCreator, il faut aller dans le menu « Outils » puis « Options… », allez dans « Compiler et exécuter… » puis l’onglet « Versions de Qt ». Cliquer sur « Ajouter » et aller chercher le fichier « /opt/qt5/bin/qmake ». Voilà, Qt5 est prêt à être utilisé.
Pour les versions récentes de Ubuntu (à partir de 13.04 je crois ?), il est possible d'utiliser les paquets libqt5* ou le paquet ubuntu-sdk
sudo apt-get update && sudo apt-get install libqt5* // ou sudo apt-get update && sudo apt-get install ubuntu-sdk
Je vous conseille d'installer également les dernières versions des compilateurs C++ : GCC 4.9 et Clang 3.4 (il y a également Clang 3.5 dans les version unstable je crois, à tester) :
sudo apt-get update && sudo apt-get install gcc-snapshoot clang-3.4 clang-3.5
Modifier le code
Il est également nécessaire de modifier un peu (ou beaucoup, si vous utilisez des fonctionnalités dépréciée de Qt 4) votre code. La première chose à faire est d’ajouter le module “widgets” (remarque : l’ajout des modules “core” et “gui” n’est pas obligatoire puisqu'ils sont inclus par défaut, je les remets pour que cela soit plus clair) :
QT *= core gui opengl // *= n'ajoute que les nouvelles valeurs greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets }
Le seconde chose à faire est de supprimer la déclaration des modules dans les includes. Par exemple :
#include <QtGui/QWidget> // devient #include <QWidget>
Dans la majorité des cas, ces deux modifications seront suffisantes. Si ce n'est pas le cas, il faudra modifier en cas par cas, n'hésitez pas à demander sur les forums.