QT 4.5 - comment puis-je obtenir un QPainter appareil dans un QGraphicsView
Je suis en train de faire un programme de peinture avec QT 4.5, donc je suis en utilisant le QGraphicsView pour la toile, et QGraphicsScene pour stocker les éléments dessinés. Pour certaines raisons, je ne pouvais pas obtenir un QPainter contexte dans ma propre dérivée de QGraphicsView
class DrawingCanvas : public QGraphicsView
{
DrawingCanvas::DrawingCanvas(QWidget * parent);
...
};
DrawingCanvas::DrawingCanvas(QWidget * parent = 0) : QGraphicsView(parent)
{
....
}
void DrawingCanvas::paintEvent(QPaintEvent& paintEventInfo)
{
//Result in painter not active
QPainter(this);
...
}
Cependant, si je change le DrawingCanvas d'être un enfant de QWidget, il fonctionne. Voyant que QGraphicsView est dérivé de QAbstractScrollArea, puis QFrame, puis QWidget, je voudrais attendre que le code du travail.
Donc je suppose que les questions sont:
1) Pourquoi est-ce que je ne peux pas utiliser paintEvent dans un QGraphicsView pour obtenir un actif QPainter?
2) Est-il possible que je puisse obtenir un?
Merci d'avance!
OriginalL'auteur Extrakun | 2009-07-13
Vous devez vous connecter pour publier un commentaire.
Si quelqu'un se demande si ce en quelque sorte est possible, la réponse est oui.
Version courte
Version longue
QGraphicsScene n'est pas de la peinture sur elle-même, mais plutôt les peintures sur la fenêtre d'affichage du widget vous le donner ou par défaut un QWidget.
Par la peinture sur la fenêtre d'affichage au lieu de cela, vous pouvez obtenir la superposition de peinture qui sera alignée à la vue et non de la scène. Vous pouvez également utiliser QGlWidget et ses paintOverlayGl().
Aussi n'oubliez pas de régler viewportUpdateMode(QGraphicsView::FullViewportUpdate) ou vous obtiendrez un rendu des artefacts. Il pourrait y avoir une façon plus intelligente pour éviter les artefacts de mettre à jour la totalité de la vue à chaque fois, mais jusqu'à ce que je rencontre des problèmes de performances, je vais la laisser reposer.
OriginalL'auteur r_ahlskog
Droit, après m'arracher les cheveux pendant un certain temps, cela semble être impossible, donc voici ma solution. Tout ce que vous dessinez doit être ajouté à la QGraphicsScene; de sorte que vous dérivez votre propre mise en œuvre.
La façon la plus simple est de définir une temporaire QGraphicsItem pointeur pour les lignes, des rectangles et etc qui vous voulez dessiner.
Remplacer le virtuel mousePressed(), mouseMove() et mouseRelease() événement en conséquence. Sur le mousePressed(), permet d'initialiser le temp QGraphicsItem pointeur et l'ajouter à la scène.
À l'intérieur de la mouseMoved(), définir le temp QGraphicsItem coordonnées en conséquence. Pour le mouseReleased, créer une copie de la température de l'objet et de l'ajouter à la scène, et de supprimer la temp QGraphicsItem (que vous avez utilisé pour dessiner des lignes, des rectangles, etc.) de la scène.
Je crois que la morale de ceci est qu'il n'y a pas de QPainter contexte au sein d'une QGraphicsView, et il vaut mieux ignorer son paintEvent().
Espère que cela aide quelqu'un qui peut trébucher sur cette.
OriginalL'auteur Extrakun
Il y a une autre possibilité: remplacer drawForeground sur la vue. Selon le type d'éléments que vous devez dessiner, cela peut être une solution très simple (par exemple, une superposition de marqueur de lignes) ou, parfois, c'est plus de travail que de créer des éléments personnalisés dans la scène dépend de vos résultats souhaités.
OriginalL'auteur James Turner