Seite 1 von 1

XOR-Zeichnung in Widget

Verfasst: 22. Oktober 2008 10:46
von graythornWW
Hallo zusammen, :P

ich stehe vor dem Problem in einem Widget Linien (und Kreise) mittels einer XOR-Zeichnung auf dem Hintergrund darzustellen. Sinn ist es, angewählte Objekte zu markieren und gegebenenfalls wieder abwählen zu können.
In QT3 konnte ich den Stift in einen XOR-Mode setzen, in QT4 scheint das nicht mehr zu gehen.
Kennt jemand eine Lösung :?:

Schon mal vielen Dank
Wolli

Verfasst: 22. Oktober 2008 12:17
von upsala

Code: Alles auswählen

void QPainter::setCompositionMode ( CompositionMode mode )
Event. wäre auch das QGraphicsView was für dich.

Verfasst: 22. Oktober 2008 12:28
von graythornWW
void QPainter::setCompositionMode ( CompositionMode mode )
ist laut Assistant NUR für Objeckte, die auf QImage arbeiten. Ich will jedoch in ein einfaches Widget zeichnen.
Event. wäre auch das QGraphicsView was für dich.
Nicht wirklich, es sei denn, ich übersehe etwas. Ich will kein rubberband aufspannen (das will ich auch), sondern primar Objekte im XOR-Modus zeichnen. Diese bestehen in der Regel aus Linien, bilden aber nicht zwangsläufig ein Rechteck.

Verfasst: 22. Oktober 2008 14:18
von Uwe
Zeichnen im XOR-Modus gibt es seit Qt4 nicht mehr.

Uwe

Verfasst: 22. Oktober 2008 15:12
von graythornWW
Zeichnen im XOR-Modus gibt es seit Qt4 nicht mehr
Das habe ich befürchtet.
Was haben sich die Qt-Entwickler dabei gedacht?

Meiner Meinung nach ist das ein aus-Kriterium der Bibliothek für bestimmte Anwendungen. Man denke z.B. an ein Konstruktionsprogram z.B. für ein Auto (mein aktuelles Projekt). Eine komplette Szene zu zeichnen dauert relativ lange, z.B. 3 Sekunden. Wenn ich jetz nur ein Objekt neu zeichne weil es z.B. selektiert wurde - und gerade die Eingaben müssen ja flüssig laufen - kann ich ja nun nicht die komplette Szene neu zeichen.

Verfasst: 22. Oktober 2008 17:18
von upsala
Du must weder eine komplette Scene neu zeichnen lassen, noch bist du mit der QGraphicsView auf ein RubberBand beschränkt. Und es gibt auch andere Möglichkeiten, als eine Auswahl im XOR-Modus darstellen zu lassen.

Verfasst: 22. Oktober 2008 20:23
von Uwe
graythornWW hat geschrieben: Was haben sich die Qt-Entwickler dabei gedacht?
Qt4 hat eine recht aufwändige Grafik Engine, die wohl erforderlich war um die üblichen Desktop Effekte wie z.B. Semi-Transparenz zu ermöglichen. Ob es möglich gewesen wäre den XOR-Modus für Situationen zu retten, in denen über Qt::WA_PaintOutsidePaintEvent direkt gezeichnet werden kann, entzieht sich meiner Kenntnis. Aber da das eh nur auf einigen Plattformen möglich ist wäre das ohnehin keine Lösung.

Ich habe mit dem Chef Designer von Trolltech am ersten QT Tag ( bevor Qt4.0.0 raus war) über dieses Thema gesprochen. Seiner Einschätzung nach waren die Desktop Effekte wichtiger und er hoffte, daß der XOR Modus mit den bis dahin üblichen Entwicklungsschritten der Hardware überflüssig werden. Damals hätte ich ihm recht gegeben, aber tatsächlich haben wir ja einen neuen Markt mit leistungsschwächeren Geräten ( z.B Nettops ) bekommen.

Natürlich benötigst Du den Inhalt Deines Widgets in einem Pixmap Cache um die notwendigen Repaints schnell genug hinzubekommen. "Gehighlightete" Passagen würde ich dann darüber malen, oder sogar als eigene Widgets implementieren. Ein Gummiband ist unter Qt in der Regel ebenfalls ein eigenes Widget, wird also gar nicht in Dein Widget gezeichnet. Wenn Du Gummibänder mit gestrichelten Linien verwenden willst solltest Du zusätzlich Qt::WA_NoSystemBackground einschalten, da z.B. X11 komplette Repaints erzwingt, wenn ihm die Kontur des Gummibands zu kompliziert wird.

Vielleicht hilft Dir meine QwtPicker Klasse aus dem Qwt Projekt weiter. Damit kannst Du auf jedem beliebigen Widget mit ein paar Zeilen Code Selektionen unterstützt von Gummibändern durchführen.

Uwe