IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Viadeo Twitter Facebook Share on Google+   
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

La vue graphique : Graphics View

La vue graphique (Graphics View) fournit une surface permettant de g�rer et d'interagir avec un grand nombre d'�l�ments graphiques 2D personnalis�s, ainsi qu'un widget d'affichage (int�grant zoom et rotation), pour visualiser ces �l�ments.

  

Le framework inclut une architecture de propagation d'�v�nements qui autorise des interactions pr�cises (calculs en double pr�cision) avec les �l�ments de la sc�ne. Les �l�ments peuvent traiter les �v�nements clavier, souris (clics, mouvements) et peuvent suivre les mouvements de la souris.

Graphics View utilise un arbre BSP (Binary Space Partitioning) pour trouver tr�s rapidement les �l�ments et, en cons�quence, peut afficher de tr�s grandes sc�nes en temps r�el, m�me avec des millions d'�l�ments.

Graphics View a �t� introduite avec Qt 4.2, rempla�ant son pr�d�cesseur, QCanvas. Si vous effectuez un portage depuis QCanvas, voir Porting to Graphics View.

L'architecture de Graphics View

Graphics View fournit une approche bas�e sur les �l�ments de la programmation mod�le-vue, similaire � ce que font les classes QTableView, QTreeView et QListView dans InterView. Plusieurs vues peuvent observer la m�me sc�ne et la sc�ne contient des �l�ments de formes g�om�triques vari�es.

La sc�ne

QGraphicsScene est la sc�ne de la vue graphique. La sc�ne a les responsabilit�s suivantes :

  • fournir une interface rapide pour g�rer un grand nombre d'�l�ments ;
  • propager les �v�nements � chaque objet ;
  • g�rer les �tats des �l�ments, comme la s�lection et le focus ;
  • fournir une fonction de rendu non transform�, principalement pour l'impression.

La sc�ne est un contenant pour les �l�ments de type QGraphicsItem. Ces �l�ments sont ajout�s � la sc�ne par l'appel de QGraphicsScene::addItem() et ensuite retrouv�s par une des nombreuses fonctions de recherche d'�l�ments. QGraphicsScene::items() et ses surcharges renvoient tous les �l�ments contenus par (ou ayant une intersection avec) un point, un rectangle, un polygone ou un chemin vectoriel quelconque. QGraphicsScene::itemAt() renvoie l'�l�ment du dessus en un point particulier. Toutes les fonctions de recherche d'�l�ments renvoient les �l�ments dans l'ordre d'empilement descendant (c'est-�-dire que le premier renvoy� est au-dessus, le dernier en dessous).

 QGraphicsScene scene;
 QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));
 
 QGraphicsItem *item = scene.itemAt(50, 50);
 // item == rect

L'architecture de propagation d'�v�nements de QGraphicsScene g�re la transmission des �v�nements de la sc�ne aux �l�ments et propage �galement les �v�nements entre �l�ments. Si la sc�ne re�oit un �v�nement de clic de souris � une position donn�e, la sc�ne envoie l'�v�nement � l'objet situ� � cette position.

QGraphicsScene g�re aussi certains �tats d'�l�ments comme la s�lection et le focus. Vous pouvez s�lectionner des �l�ments de la sc�ne en appelant QGraphicsScene::setSelectionArea(), en passant une forme arbitraire. Cette fonction est aussi utilis�e pour la s�lection rectangulaire dans QGraphicsView. Pour obtenir la liste de tous les �l�ments actuellement s�lectionn�s, appelez QGraphicsScene::selectedItems(). Un autre �tat trait� par QGraphicsScene est le suivi de l'�l�ment ayant le focus pour l'entr�e au clavier. Vous pouvez donner le focus � un �l�ment par QGraphicsScene::setFocusItem() ou utiliser QGraphicsItem::setFocus() pour conna�tre l'�l�ment ayant le focus par QGraphicsScene::focusItem().

Enfin, QGraphicsScene vous permet un rendu de parties de la sc�ne dans un QPainter par la fonction QGraphicsScene::render(). Vous pourrez en lire davantage sur ce sujet dans la section Impression plus loin dans ce document.

La vue graphique

QGraphicsView est le widget vue, qui affiche le contenu d'une sc�ne. Vous pouvez attacher plusieurs vues � la m�me sc�ne, pour fournir plusieurs affichages du m�me jeu de donn�es. Le widget vue est une zone de d�filement (scroll) et fournit des barres de d�filement pour naviguer dans de grandes sc�nes. Pour activer le support OpenGL, vous pouvez choisir un visualiseur QGLWidget en appelant QGraphicsView::setViewport().

 QGraphicsScene scene;
 myPopulateScene(&scene);
 
 QGraphicsView view(&scene);
 view.show();

La vue re�oit des �v�nements d'entr�e depuis le clavier et la souris et les traduit en �v�nements de la sc�ne (en convertissant les coordonn�es en coordonn�es de la sc�ne si n�cessaire), avant d'envoyer les �v�nements � la sc�ne visualis�e.

En utilisant sa matrice de transformation, QGraphicsView::transform(), la vue peut transformer le syst�me de coordonn�es de la sc�ne. Ceci permet des fonctions de navigation avanc�es comme le zoom et la rotation. Par commodit�, QGraphicsView fournit aussi des fonctions pour la conversion entre coordonn�es de la vue et de la sc�ne : QGraphicsView::mapToScene() et QGraphicsView::mapFromScene().

image

L'�l�ment graphique

QGraphicsItem est la classe de base pour tous les �l�ments graphiques dans une sc�ne. La vue graphique fournit plusieurs �l�ments standards pour des formes typiques, comme des rectangles (QGraphicsRectItem), ellipses (QGraphicsEllipseItem) et textes mais en cr�ant des QGraphicsItem personnalis�s on acc�de aux fonctions les plus puissantes. Parmi d'autres, QGraphicsItem fournit les fonctions suivantes :

  • �v�nements souris : mouvements, clic, double clic, appui et rel�chement de boutons, survol, molette et menu contextuel ;
  • clavier : focus et �v�nements des touches ;
  • glisser-d�poser ;
  • groupement, � la fois par la relation parent-enfant et QGraphicsItemGroup ;
  • d�tection de collision.

Un QGraphicsItem r�side dans un syst�me de coordonn�es local et, comme QGraphicsView, il fournit des fonctions pour convertir des coordonn�es entre l'�l�ment et la sc�ne et d'�l�ment � �l�ment. Comme QGraphicsView, il peut transformer son syst�me de coordonn�es avec une matrice QGraphicsItem::transform(), ce qui est utile pour des rotations et changements d'�chelle d'�l�ments individuels.

Les �l�ments peuvent contenir des �l�ments enfants. Les transformations de l'�l�ment parent sont h�rit�es par les enfants. Cependant, ind�pendamment des transformations successives d'un �l�ment, toutes ses fonctions (comme QGraphicsItem::contains(), QGraphicsItem::boundingRect() ou QGraphicsItem::collidesWith()) op�rent toujours en coordonn�es locales.

QGraphicsItem g�re la d�tection de collision en utilisant la fonction QGraphicsItem::shape() et QGraphicsItem::collidesWith(), qui sont toutes deux des fonctions virtuelles. En renvoyant la forme de votre �l�ment sous forme de QPainterPath en coordonn�es locales depuis QGraphicsItem::shape(), QGraphicsItem se chargera pour vous de la d�tection de collision. Si vous voulez g�rer vous-m�me la d�tection de collision, vous pouvez r�impl�menter QGraphicsItem::collidesWith().

image

Les classes de la vue graphique

Ces classes fournissent un framework pour la cr�ation d'applications interactives.

QAbstractGraphicsShapeItem Base commune pour toutes les formes
QGraphicsAnchor Repr�sente une ancre entre deux �l�ments dans un QGraphicsAnchorLayout
QGraphicsAnchorLayout Layout qui permet d'ancrer ensemble des widgets dans une vue graphique
QGraphicsEffect La classe de base pour les effets graphiques
QGraphicsEllipseItem Ellipse ajoutable � une QGraphicsScene
QGraphicsGridLayout Layout grille pour des widgets dans une vue graphique
QGraphicsItem La classe de base pour tous les �l�ments graphiques d'une QGraphicsScene
QGraphicsItemAnimation Gestion simple d'une animation d'un QGraphicsItem
QGraphicsItemGroup Contenant traitant un groupe d'�l�ments comme un seul �l�ment
QGraphicsLayout La classe de base pour tous les layouts d'une vue graphique
QGraphicsLayoutItem Peut �tre h�rit� pour autoriser l'int�gration d'�l�ments personnalis�s dans un layout
QGraphicsLineItem Ligne ajoutable � une QGraphicsScene
QGraphicsLinearLayout Layout horizontal ou vertical pour des widgets d'une vue graphique
QGraphicsObject Classe de base pour tous les �l�ments graphiques n�cessitant signaux, slots et propri�t�s
QGraphicsPathItem Chemin ajoutable � une QGraphicsScene
QGraphicsPixmapItem Pixmap ajoutable � une QGraphicsScene
QGraphicsPolygonItem Polygone ajoutable � une QGraphicsScene
QGraphicsProxyWidget Proxy pour l'int�gration d'un QWidget dans une QGraphicsScene
QGraphicsRectItem Rectangle ajoutable � une QGraphicsScene
QGraphicsScene Surface pour la gestion d'un grand nombre d'objets graphiques 2D
QGraphicsSceneContextMenuEvent �v�nements de menu contextuel dans le framework Graphics View
QGraphicsSceneDragDropEvent �v�nements de glisser-d�poser dans le framework Graphics View
QGraphicsSceneEvent Classe de base pour tous les �v�nements li�s � la vue graphique
QGraphicsSceneHelpEvent �v�nements sur demande d'infobulle (tooltip)
QGraphicsSceneHoverEvent �v�nements survol dans le framework Graphics View
QGraphicsSceneMouseEvent �v�nements souris dans le framework Graphics View
QGraphicsSceneMoveEvent �v�nements pour les mouvements de widgets dans le framework Graphics View
QGraphicsSceneResizeEvent �v�nements pour les redimensionnements de widgets dans le framework Graphics View
QGraphicsSceneWheelEvent �v�nements molette dans le framework Graphics View
QGraphicsSimpleTextItem Chemin de texte simple ajoutable � une QGraphicsScene
QGraphicsSvgItem QGraphicsItem pour l'affichage du contenu de fichiers SVG
QGraphicsTextItem Texte format� ajoutable � une QGraphicsScene
QGraphicsTransform Classe de base abstraite pour construire des transformations avanc�es sur des QGraphicsItems
QGraphicsView Widget affichant le contenu d'une QGraphicsScene
QGraphicsWidget La classe de base pour tous les widgets QGraphicsScene
QStyleOptionGraphicsItem Utilis� pour d�crire les param�tres requis pour dessiner un QGraphicsItem

Le syst�me de coordonn�es

Graphics View est bas�e sur le syst�me de coordonn�es cart�sien : la position et la g�om�trie des �l�ments de la sc�ne sont repr�sent�s par des couples de coordonn�es x et y. Lorsqu'on observe une sc�ne dans une vue non transform�e, une unit� de la sc�ne est repr�sent�e par un pixel de l'�cran.

Note : le syst�me avec l'axe Y invers� (o� y augmente vers le haut) n'est pas g�r� �tant donn� que les vues graphiques utilisent le syst�me de coordonn�es de Qt.

Trois syst�mes de coordonn�es coexistent dans Graphics View : les coordonn�es �l�ment, sc�ne et vue. Pour simplifier votre travail, Graphics View fournit des fonctions utilitaires qui vous permettent diverses conversions entre les trois syst�mes de coordonn�es.

Pendant le rendu, les coordonn�es sc�ne correspondent au coordonn�es logiques de QPainter et les coordonn�es vue correspondent aux coordonn�es du dispositif de rendu (appel�es coordonn�es physiques ou device). La description de la relation entre coordonn�es logiques et physiques se trouve dans la documentation du syst�me de coordonn�es.

image

Les �l�ments vivent dans leur propre syst�me de coordonn�es local. L'origine des coordonn�es est g�n�ralement leur point central

(0, 0)

, qui est aussi l'axe des transformations. Les primitives g�om�triques dans le syst�me de coordonn�es local sont souvent appel�es points, lignes ou rectangles de l'�l�ment.

� la cr�ation d'un �l�ment personnalis�, vous ne vous pr�occupez que des coordonn�es locales, QGraphicsScene et QGraphicsView effectueront toutes les transformations pour vous. Cela rend l'impl�mentation d'�l�ments personnalis�s tr�s simple. Par exemple, si vous recevez un �v�nement clic ou glissement de souris, la position de l'�v�nement est fournie en coordonn�es locales. La fonction virtuelle QGraphicsItem::contains(), qui renvoie vrai si un point donn� est � l'int�rieur de votre �l�ment et faux sinon, prend un argument point en coordonn�es locales. De la m�me fa�on, le rectangle (ou la forme) fronti�re sont en coordonn�es locales.

La position d'un �l�ment correspond aux coordonn�es de son centre dans le syst�me de coordonn�es de son parent ; elle est parfois appel�e coordonn�es parent. Dans ce sens la sc�ne est consid�r�e comme le « parent » de tous les objets sans parent : la position des objets de premier niveau est en coordonn�es de sc�ne.

Les coordonn�es des enfants sont relatives � celles de leur parent. Si l'enfant n'est pas transform�, la diff�rence entre ses coordonn�es et celles du parent est la m�me que la distance entre les �l�ments dans les coordonn�es du parent. Par exemple, si un enfant non transform� est positionn� pr�cis�ment au centre de son parent, les syst�mes de coordonn�es des deux �l�ments seront identiques. Par contre, si l'enfant est en position (10, 0), le point (0, 10) de l'enfant correspondra au point (10, 10) du parent.

�tant donn� que la position et les transformations d'un �l�ment sont relatives � son parent, les coordonn�es locales de l'enfant ne sont pas affect�es par les transformations du parent, bien que les transformations du parent transforment implicitement l'enfant. Dans l'exemple pr�c�dent, m�me si le parent est agrandi ou tourn�, le point (0,10) de l'enfant correspondra toujours au point (10 ,10) du parent. Cependant, relativement � la sc�ne, l'enfant va suivre les transformations du parent : si le parent est agrandi d'un facteur 2, la position de l'enfant sera (20, 0) en coordonn�es de sc�ne et son point (10, 0) correspondra au point (40, 0) de la sc�ne.

Avec QGraphicsItem::pos(), l'une des seules exceptions, les fonctions de QGraphicsItem op�rent en coordonn�es locales, ind�pendamment des transformations de l'�l�ment ou de ses parents. Par exemple, le rectangle fronti�re d'un �l�ment (soit QGraphicsItem::boundingRect()) est toujours donn� en coordonn�es locales de l'�l�ment.

Les coordonn�es de sc�ne

La sc�ne repr�sente le syst�me de coordonn�es de base pour tous ses �l�ments. Le syst�me de coordonn�es de la sc�ne d�crit la position de tous les �l�ments de premier niveau et forme �galement la base pour tous les �v�nements de sc�ne envoy�s � la sc�ne par la vue. Chaque �l�ment de la sc�ne a une position dans la sc�ne (QGraphicsItem::scenePos(), QGraphicsItem::sceneBoundingRect()), en plus de sa position et sa fronti�re locales. La position de sc�ne d�crit la position d'un �l�ment en coordonn�es de sc�ne et son rectangle fronti�re forme la base � partir de laquelle QGraphicsScene d�termine quelles parties de la sc�ne ont chang�. Les changements de la sc�ne sont communiqu�s par le signal QGraphicsScene::changed(), dont les arguments sont une suite de rectangles dans la sc�ne.

Coordonn�es de vue

Les coordonn�es de vue sont les coordonn�es du widget, avec comme unit� le pixel. La particularit� de ce syst�me de coordonn�es est qu'il est relatif au widget ou � la zone d'affichage et non affect� par la sc�ne observ�e. Le coin sup�rieur gauche de la zone d'affichage du QGraphicsView est toujours (0, 0) et le coin inf�rieur droit est toujours (largeur de la zone, hauteur de la zone). Tous les �v�nements souris et glisser-d�poser sont originellement re�us en coordonn�es de vue et vous devez les convertir en coordonn�es de sc�ne pour interagir avec les �l�ments de la sc�ne.

Conversion de coordonn�es

Souvent, lors de la manipulation d'�l�ments d'une sc�ne, il peut �tre utile de convertir des coordonn�es ou des formes arbitraires de la sc�ne vers un �l�ment ou inversement ou entre �l�ments. Par exemple, quand vous cliquez dans la zone d'affichage d'une QGraphicsView, vous pouvez demander � la sc�ne quel �l�ment se trouve sous le curseur en appelant QGraphicsView::mapToScene(), suivi de QGraphicsScene::itemAt(). Si vous voulez savoir o� un �l�ment se trouve dans la zone d'affichage, vous pouvez appeler QGraphicsItem::mapToScene() sur l'�l�ment, puis QGraphicsView::mapFromScene() sur la vue. Autre exemple, si vous voulez savoir quels �l�ments se trouvent dans une ellipse de la vue, vous pouvez passer un QPainterPath � mapToScene() et ensuite passer le chemin converti � QGraphicsScene::items().

Vous pouvez convertir des coordonn�es et des formes vers et depuis la sc�ne d'un �l�ment en appelant QGraphicsItem::mapToScene() et QGraphicsItem::mapFromScene(). Vous pouvez aussi convertir vers/depuis le parent en appelant QGraphicsItem::mapToParent() et QGraphicsItem::mapFromParent() ou entre �l�ments en appelant QGraphicsItem::mapToItem() et QGraphicsItem::mapFromItem(). Toutes les fonctions de conversion peuvent convertir points, rectangles, polygones et chemins.

Les m�mes fonctions de conversion sont disponibles dans la vue, pour convertir vers/depuis la sc�ne. Il s'agit de QGraphicsView::mapFromScene() et QGraphicsView::mapToScene(). Pour convertir depuis une vue vers un �l�ment, vous devez convertir vers la sc�ne, puis de la sc�ne vers l'�l�ment.

Fonctions principales

Zoom et rotation

QGraphicsView permet les m�mes transformations affines que QPainter � travers QGraphicsView::setMatrix(). En appliquant une transformation � une vue, vous pouvez facilement ajouter des fonctions de navigation courantes comme le zoom et la rotation.

Voici un exemple d'impl�mentation de slots de zoom et de rotation dans une sous-classe de QGraphicsView :

 class View : public QGraphicsView
 {
 Q_OBJECT
     ...
 public slots:
     void zoomIn() { scale(1.2, 1.2); }
     void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
     void rotateLeft() { rotate(-10); }
     void rotateRight() { rotate(10); }
     ...
 };

Les slots pourraient �tre connect�s � des QToolButtons avec autoRepeat activ�.

QGraphicsView conserve la position du centre de la vue quand vous la transformez.

Voir aussi les exemples Elastic Nodes pour du code montrant l'impl�mentation de fonctions de zoom.

Impression

La vue graphique permet d'imprimer avec une seule ligne de code � travers ses fonctions de rendu, QGraphicsScene::render() et QGraphicsView::render(). Les fonctions fournissent la m�me API : la sc�ne ou la vue peuvent rendre tout ou partie de leur contenu sur n'importe quelle surface de dessin en passant un QPainter � l'une des fonctions de rendu. Cet exemple montre comment imprimer la sc�ne enti�re dans une pleine page, utilisant QPrinter.

 QGraphicsScene scene;
 scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
 
 QPrinter printer;
 if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
     QPainter painter(&printer);
     painter.setRenderHint(QPainter::Antialiasing);
     scene.render(&painter);
 }

La diff�rence entre les fonctions de rendu de sc�ne et de vue est que l'une op�re en coordonn�es de sc�ne, l'autre en coordonn�es de vue. QGraphicsScene::render() est souvent pr�f�r�e pour imprimer des segments entiers non transform�s, comme pour le trac� de donn�es g�om�triques, ou pour imprimer un document texte. QGraphicsView::render(), de son c�t�, est adapt� pour la copie d'�cran ; son comportement par d�faut est de rendre le contenu exact de la zone d'affichage en utilisant le QPainter fourni.

 QGraphicsScene scene;
 scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
 
 QPixmap pixmap;
 QPainter painter(&pixmap);
 painter.setRenderHint(QPainter::Antialiasing);
 scene.render(&painter);
 painter.end();
 
 pixmap.save("scene.png");

Lorsque les tailles des zones source et destination ne correspondent pas, le contenu de la source est �tir� pour remplir la zone destination. En passant un Qt::AspectRatioMode � la fonction de rendu que vous utilisez, vous pouvez choisir de conserver ou d'ignorer les proportions de la sc�ne quand le contenu est �tir�.

Glisser-d�poser

Comme QGraphicsView d�rive indirectement de QWidget, elle fournit d�j� les m�mes fonctions de glisser-d�poser que QWidget. De plus, par commodit�, le framework Graphics View fournit une gestion de glisser-d�poser pour la sc�ne et pour chacun de ses �l�ments. Quand la vue re�oit un d�but de glissement, elle traduit les �v�nements de glisser-d�poser en QGraphicsSceneDragDropEvent, qui sont transmis � la sc�ne. La sc�ne prend le relai de la gestion de cet �v�nement et l'envoie au premier �l�ment sous le curseur acceptant les d�poses.

Pour commencer le glissement d'un �l�ment, cr�ez un objet QDrag en lui passant un pointeur sur le widget � glisser. Les �l�ments peuvent �tre observ�s par plusieurs vues simultan�ment mais une seule peut initier le glissement. Les glissements sont en g�n�ral initi�s par un clic ou un mouvement de souris et, dans ce cas, vous pouvez obtenir le widget source dans mousePressEvent() ou mouseMoveEvent(). Par exemple :

 void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
 {
     QMimeData *data = new QMimeData;
     data->setColor(Qt::green);
 
     QDrag *drag = new QDrag(event->widget());
     drag->setMimeData(data);
     drag->start();
 }

Pour intercepter les �v�nements de glisser-d�poser pour une sc�ne, r�impl�mentez QGraphicsScene::dragEnterEvent() et les gestionnaires d'�v�nements dont votre sc�ne a besoin dans une sous-classe de QGraphicsItem. Vous pourrez en lire davantage sur les glisser-d�poser dans la documentation de chaque gestionnaire d'�v�nements de QGraphicsScene.

Les �l�ments peuvent aussi activer la gestion du glisser-d�poser en appelant QGraphicsItem::setAcceptDrops(). Pour traiter les demandes de glissement, r�impl�mentez QGraphicsItem::dragEnterEvent(), QGraphicsItem::dragMoveEvent(), QGraphicsItem::dragLeaveEvent() et QGraphicsItem::dropEvent().

Voir aussi l'exemple Drag and Drop Robot pour une d�monstration des op�rations de glisser-d�poser.

Pointeurs de souris et infobulles

Comme QWidget, QGraphicsItem g�re les pointeurs de souris (QGraphicsItem::setCursor()) et les infobulles (QGraphicsItem::setToolTip()). Pointeurs et infobulles sont activ�s par QGraphicsView quand le pointeur de la souris entre dans le p�rim�tre de l'�l�ment (d�tect� par QGraphicsItem::contains()).

Vous pouvez aussi d�finir un pointeur par d�faut pour la vue en appelant QGraphicsView::setCursor().

Voir aussi Drag and Drop Robot pour un exemple de code impl�mentant infobulles et gestion de forme de pointeur.

Animations

La vue graphique g�re les animations � diff�rents niveaux. Vous pouvez facilement assembler des animations en utilisant le framework Animation. Pour cela vos �l�ments doivent h�riter de QGraphicsObject et s'associer avec QPropertyAnimation. QPropertyAnimation permet d'animer toutes les propri�t�s d'un QObject.

Une autre option est de cr�er un objet personnalis� h�ritant de QObject et QGraphicsItem. L'objet peut alors cr�er ses propres timers et contr�ler des animations avec des �tapes incr�mentales dans QObject::timerEvent().

Une troisi�me option, principalement disponible pour la compatibilit� avec QCanvas de Qt 3, est d?avancer la sc�ne en appelant QGraphicsScene::advance(), qui, � son tour, appelle QGraphicsItem::advance().

Rendu OpenGL

Pour activer le rendu OpenGL, d�finissez simplement un QGLWidget comme afficheur de QGraphicsView en appelant QGraphicsView::setViewport(). Si vous voulez un OpenGL avec antialiasing, il vous faut activer la gestion multi-�chantillons d'OpenGL (voir QGLFormat::sampleBuffers()).

Exemple :

 QGraphicsView view(&scene);
 view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

Groupes d'�l�ments

En rendant un �l�ment l'enfant d'un autre �l�ment, vous pouvez obtenir la fonction essentielle du groupement d'�l�ments : les �l�ments vont se d�placer ensemble et toutes les transformations sont propag�es de parent � enfant.

De plus, QGraphicsItemGroup est un �l�ment sp�cial qui combine la gestion d'�v�nements des enfants avec une interface utile pour ajouter des �l�ments � un groupe ou en retirer. L'ajout d'un �l�ment � un QGraphicsItemGroup conserve la position et les transformations de l'�l�ment, alors que le changement de parent provoque en g�n�ral un repositionnement de l'enfant relativement � son nouveau parent. Il est commode de cr�er des QGraphicsItemGroup � partir de la sc�ne en appelant QGraphicsScene::createItemGroup().

Widgets et Layouts

Qt 4.4 a introduit la gestion de la g�om�trie et de la disposition (layout) des �l�ments avec QGraphicsWidget. Cet �l�ment de base sp�cial est similaire � QWidget mais, contrairement � QWidget, il ne d�rive pas de QPaintDevice mais de QGraphicsItem. Ceci permet d'�crire des widgets complets, avec �v�nements, signaux et slots, indications de taille et permet �galement de g�rer la g�om�trie de vos widgets dans des layouts � travers QGraphicsLinearLayout et QGraphicsGridLayout.

QGraphicsWidget

Profitant des capacit�s et de la faible consommation en ressources de QGraphicsItem, QGraphicsWidget fournit le meilleur des deux mondes : des fonctions suppl�mentaires de QWidget, comme le style, la police, la palette, le layout et la g�om�trie ainsi que la gestion des transformations de QGraphicsItem. Comme la vue graphique utilise des coordonn�es flottantes au lieu d'entiers, les fonctions g�om�triques de QGraphicsWidget op�rent �galement sur QRectF et QPointF. Ceci s'applique aussi aux bordures, marges et espacements. Avec QGraphicsWidget, il n'est pas rare de sp�cifier des marges de (0.5, 0.5, 0.5, 0.5), par exemple. Vous pouvez cr�er � la fois des sous-widgets et des fen�tres de premier niveau ; dans certains cas, vous pouvez utiliser la vue graphique pour des applications multi-documents (MDI) avanc�es.

Certaines propri�t�s de QWidget sont g�r�es, dont les drapeaux et attributs de fen�tre, mais pas toutes. R�f�rez-vous � la documentation de la classe QGraphicsWidget pour une vue d'ensemble de ce qui est ou n'est pas g�r�. Par exemple, vous pouvez cr�er des fen�tres d�cor�es en passant le drapeau de fen�tre Qt::Window au constructeur de QGraphicsWidget mais la vue graphique ne conna�t pas les drapeaux Qt::Sheet et Qt::Drawer qui sont courants sur Mac OS X.

Les capacit�s de QGraphicsWidget devraient augmenter en fonction des retours de la communaut�.

QGraphicsLayout

QGraphicsLayout fait partie d'un framework de layout de deuxi�me g�n�ration con�u sp�cialement pour QGraphicsWidget. Son API ressemble beaucoup � celle de QLayout. Vous pouvez g�rer des widgets et des sous-layouts dans QGraphicsLinearLayout ou dans QGraphicsGridLayout. Vous pouvez �galement �crire votre propre layout facilement en d�rivant QGraphicsLayout ou ajouter vos propres QGraphicsItem au layout en �crivant une classe d�riv�e de QGraphicsLayoutItem.

Inclusion de widgets

La vue graphique permet l'inclusion transparente de widgets quelconques dans la sc�ne. Vous pouvez inclure des widgets simples comme QLineEdit ou QPushButton, des widgets complexes comme QTabWidget et m�me des fen�tres principales compl�tes. Pour int�grer vos widgets dans la sc�ne, appelez simplement QGraphicsScene::addWidget() ou cr�ez une instance de QGraphicsProxyWidget pour ajouter vos widgets manuellement.

Avec QGraphicsProxyWidget, la vue graphique est capable d'int�grer compl�tement les fonctions du widget client, y compris ses pointeurs, infobulles, �v�nements souris, clavier et tablette, widgets enfants, animations, pop-ups (par exemple QComboBox ou QCompleter), l'activation et le focus de saisie. QGraphicsProxyWidget int�gre aussi l'ordre de tabulation du widget inclus afin que vous puissiez tabuler vers et depuis ce widget. Vous pouvez m�me inclure une nouvelle QGraphicsView dans votre sc�ne pour cr�er des sc�nes imbriqu�es complexes.

Lorsqu'elle transforme un widget inclus, la vue graphique s'assure de ce que le widget est transform� ind�pendamment de la r�solution, ce qui permet aux polices et aux styles de rester nets en cas d'agrandissement (notez que l'effet de l'ind�pendance vis-�-vis de la r�solution d�pend du style).

Performance

Instructions en virgule flottante

Pour pouvoir pr�cis�ment et rapidement appliquer des transformations et des effets aux �l�ments, la vue graphique suppose que le mat�riel de l'utilisateur est capable de fournir des performances raisonnables pour les instructions en virgule flottante.

De nombreuses stations de travail et ordinateurs de bureau sont �quip�s de composants ad�quats pour acc�l�rer ce type de calcul mais certains appareils embarqu�s peuvent ne disposer que d'une �mulation logicielle des op�rations math�matiques ou des instructions en virgule flottante.

En cons�quence, certains effets peuvent �tre plus lents qu'attendu sur certains appareils. Il peut �tre possible de compenser cette baisse de performances en r�alisant des optimisations dans d'autres domaines ; par exemple, en utilisant OpenGL pour rendre une sc�ne. Cependant, de telles optimisations peuvent elles-m�mes r�duire les performances si elles comptent sur la pr�sence de composants calculant en virgule flottante.

Remerciements

Merci � <!idiallo!> pour la traduction et � <!dourouc!> ainsi qu'� <!jacques_jean!> pour leur relecture !

Cette page est une traduction d'une page de la documentation de Qt, �crite par Nokia Corporation and/or its subsidiary(-ies). Les �ventuels probl�mes r�sultant d'une mauvaise traduction ne sont pas imputables � Nokia. Qt 4.7
Copyright © 2025 Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'� 3 ans de prison et jusqu'� 300 000 E de dommages et int�r�ts. Cette page est d�pos�e � la SACD.
Vous avez d�nich� une erreur ? Un bug ? Une redirection cass�e ? Ou tout autre probl�me, quel qu'il soit ? Ou bien vous d�sirez participer � ce projet de traduction ? N'h�sitez pas � nous contacter ou par MP !