XOR-Zeichnung in Widget

Alles rund um die Programmierung mit Qt
Antworten
graythornWW
Beiträge: 38
Registriert: 20. Oktober 2008 09:48

XOR-Zeichnung in Widget

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

void QPainter::setCompositionMode ( CompositionMode mode )
Event. wäre auch das QGraphicsView was für dich.
graythornWW
Beiträge: 38
Registriert: 20. Oktober 2008 09:48

Beitrag 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.
Uwe
Beiträge: 176
Registriert: 9. Oktober 2005 13:37
Wohnort: München

Beitrag von Uwe »

Zeichnen im XOR-Modus gibt es seit Qt4 nicht mehr.

Uwe
graythornWW
Beiträge: 38
Registriert: 20. Oktober 2008 09:48

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Uwe
Beiträge: 176
Registriert: 9. Oktober 2005 13:37
Wohnort: München

Beitrag 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
Antworten