QGraphicsView und paintEvent()

Alles rund um die Programmierung mit Qt
Antworten
griffin27
Beiträge: 12
Registriert: 13. Februar 2009 15:20

QGraphicsView und paintEvent()

Beitrag von griffin27 »

Hallo,

ich möchte für einen einfachen Vektorgrafik Editor Tool-Darstellungen für Objekte machen.
Also zB. die schwarzen kleinen Kästchen, an denen man ein Rechteck oder einen Kreis skalieren kann. So wie zB in Inkscape.

Solche Rechtecke (ich nenn sie mal Handles) haben ja nichts in einer QGraphicsScene verloren, da dort ja nur die Zeichnung liegen sollte. Es macht ja keinen Sinn, dass solche Handles gezoomt dargestellt werden so wie die scene selbst, sondern die solten ja immer gleich groß sein (eben in Bildschirmkoordinaten).

Deswegen habe ich mir gedacht, dass ich einfach in
QGraphicsView::paintEvent(QPaintEvent* event)
nach der Standardimplementierung (darstellen der QGraphicsScene) noch mein Benutzerinterface drüberzeichne.

Mein Code, den ich versucht habe schaut so aus:

Code: Alles auswählen

void View::paintEvent(QPaintEvent *event)
{
	QGraphicsView::paintEvent(event); // call standard implementation
	QPainter p(viewport()); // neuer painter
	//p.setBackgroundMode(Qt::TransparentMode); // ändert nichts
	p.drawRect(100,100,50,30); // Test
}
Aber nun wird die gerenderte Scene immer gleich vom neuen QPainter mit einem weißen Hintergrund übermalt. (Das ganze führt zu einem blitzlicht, wenn man die Maus bewegt, die ein update() aufruft)

Wie würdet ihr sowas lösen?

lg, Karl
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QGraphicsView und paintEvent()

Beitrag von franzf »

Warum sollte in der scene nur das svg liegen? ("Mobiltelefone sind nur zum Telefonieren da!") Es solte eigentlich das einfachste sein, ein EditorItem zu erstellen, das an den entsprechenden Stellen Rechtecke einfügt.
Um auf transformations zu reagieren, kannst du mal mit ItemFlag und ItemChange rumspielen. Ich hab das noch nie gemacht, aber so würde ich es angehen.
Das Problem mit einem Overlay: Du musst ständig rumrechnen, welcher Ausschnitt und Transform gerade drin liegt, dann exakt deine Punkte bestimmen und darüber zeichnen. Ist mMn. aufwändiger als das Item in der Scene zu lassen und über obige Flags heran zu gehen.
maikelmeyers
Beiträge: 20
Registriert: 16. Mai 2010 17:19

Re: QGraphicsView und paintEvent()

Beitrag von maikelmeyers »

Ich hab auch schon so ein kleines Vektor-Tool geschrieben und es funktioniert hervorragend die Handles auch als Objekte der Scene zu implementieren. Schliesslich gibt es das itemIgnoresTransformations Flag, dass verhindert dass diese Items beim Zoomen usw. ihre Größe verändern.
Antworten