2009-06-24 12 views
8

Je crée des données graphiques affichant widget dans Qt4 et je fus tenté d'utiliser le QGraphicsScene pour cela, créer QGraphicsItem s pour les éléments de données, etc.Comment dois-je utiliser un QGraphicsScene avec des configurations et des widgets

Cependant, Je voulais ajouter une couche de contrôles (par exemple, barres de défilement, zoom + autres boutons - je veux le faire dans un style similaire à Google Maps, par exemple, les données seraient affichées partout dans le widget, et les boutons seraient être montré au-dessus d'eux) au widget. J'ai donc pensé qu'il serait possible de les ajouter à la scène (peut-être en tant qu'enfant d'un QGraphicsGroupItem qui serait montré sur les données). Mais je veux qu'ils bougent & redimensionner quand je redimensionne l'ensemble du widget, donc je devrais utiliser un QGraphicsLayout pour les gérer. Mais à ce stade, j'ai découvert que les choses sont assez compliquées.

Le problème est que lorsque vous utilisez QGraphicsLayout, les contraintes suivantes sont:

  1. Seul un QGraphicsWidget peut être géré par une mise en page
  2. QGraphicsLayout ne peut être utilisé pour gérer les enfants d'un QGraphicsWidget

Ce qui signifie que je devrais créer mes contrôles comme QGraphicsWidget s, ajouter un QGraphicsWidget de haut niveau au widget de données, et gérer t la taille de ce widget de niveau supérieur moi-même.

Je veux demander:

  1. Ne serait pas une approche classique (par exemple utiliser des widgets vieux pour tous les contrôles simples et utiliser QGraphicsScene uniquement pour afficher les données.) Être plus raisonnable?

  2. Y a-t-il un avantage à utiliser QGraphicsScene dans ce cas (performance ou simplicité ...)? Comment utiliser QGraphicsScene pour exploiter ses points forts?

Répondre

1

Si vous pensez que QGraphicsScene (ou tout autre widget que vous avez) est approprié pour la plupart de votre écran, utiliser. Ce que nous avons fait par le passé pour des choses quelque peu similaires est de faire un widget personnalisé qui hérite (d'une manière ou d'une autre) de QWidget, et de mettre les widgets de contrôle dans une disposition au-dessus de ce widget. Cela signifie que le widget entier dessine tout ce que vous voulez dessiner, et les widgets de contrôle sont au-dessus de cela, en le redimensionnant lorsque l'ensemble du widget est redimensionné. En outre, à quelques reprises, nous avons eu des mises en page qui étaient un peu trop compliquées pour que les widgets de mise en page puissent les manipuler facilement. Plutôt que de créer une mise en page personnalisée, nous les avons simplement positionnés sans mise en page et les avons déplacés dans le code de l'événement de redimensionnement. Cela fonctionne aussi bien.

+0

Le plus gros problème avec QGraphicsScene est qu'il est pas vraiment un widget. C'est quelque chose comme une collection d'éléments (comme des rectangles, des ellipses ...) qui sont dessinés automatiquement, qui peuvent être zoomés, etc. Ce que vous décrivez est la manière classique et simple du widget, et je m'en tiendrai probablement là.Je voulais utiliser la fonctionnalité "brillante et nouvelle", mais à la deuxième réflexion, elle ne me semble pas si brillante, sauf que quelqu'un me prouve que je me trompe :) – jpalecek

+0

jpalecek: consultez le widget "horloges" demo @ http: // www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. Rien d'extraordinaire à avoir un widget horloge mais l'implémentation pour cela se fait avec QGraphics (Scene | Widget | View | Item). – rasjani

+0

@jpalecek: Je ne pensais pas qu'un QGraphicsScene était un widget, c'est pourquoi j'ai dit d'hériter "d'une manière ou d'une autre". Mais vous avez un QGraphicsView (ou quelque chose de similaire), non? Vous voulez probablement mettre vos widgets dessus, à moins que vous ne vouliez les transformer avec votre scène. Je pense que dans ce cas, la manière simple du widget est plus simple et plus directe. –

6

Depuis Qt 4.4, vous pouvez intégrer des widgets classiques dans un QGraphicsScene en utilisant QGraphicsProxyWidget:

QWidget *widget = new QWidget; 
QGraphicsScene scene; 
QGraphicsProxyWidget *proxy = scene.addWidget(widget);