Seite 1 von 1

Rubberband (Auswahlbereich) mit QT 3.3.x

Verfasst: 20. Oktober 2006 15:24
von stevy
Hallo.

Ich möchte in einem Canvas ein Rechteck als Auswahlbereich ziehen können und diesen Ausschnitt dann vollständig im Canvas anzeigen, also zoomen.
In QT 4 gibt es dafür das Rubberband. Hat das schon mal jemand so ähnlich für QT 3.3 programmiert?

Vielen Dank,
Stevy

Verfasst: 20. Oktober 2006 20:15
von Uwe
In Qwt (http://qwt.sf.net) gibt es eine Klasse QwtPicker, die vermutlich das leistet was Du benötigst.

Im Prinzip ist sie folgendermassen zu benutzen:

QwtPicker *picker = new QwtPicker(canvasView->viewport());
picker->setSelectionFlags(QwtPicker::DragSelection | QwtPicker::CornerToCorner);
connect(picker, SIGNAL(selected(...)), ...);

In Qwt 4.2 findest Du die klassische Implementierung, die das Gummiband über Zeichnen im XOR mode realisiert. In Qwt 5.x (läuft mit Qt3 oder Qt4) habe ich auf alles verzichtet, was es in Qt4 nicht mehr gibt, und das Gummiband ist als ein maskiertes Widget das über der canvas liegt implementiert.

Die Implementierung im XOR mode ist natürlich sehr viel schneller, was man z.B merkt, wenn man X11 remote über eine langsame Leitung fährt. Der Qwt5 Picker kann dafür auch Texte mit antialiased Fonts (Positions Tracker) rumschieben. ( Hier haben wir übrigens einen der Fälle in denen Qt3 Qt4 überlegen ist. )

Wenn Du Qwt zu Deiner Applikation nicht dazu linken willst, kannst Du den Code einfach auf Deine Bedürfnisse abspecken.

Eine Anmerkung noch zu QRubberband: ich habe während der Qt 4.0 Phase mal probiert, ob ich den Picker damit implementiere, bin aber sehr schnell davon abgekommen. Der Grund war, daß ich da viel zu dicke Linien (mehrere Pixel mit einem Füllmuster) hatte, die zum feinen Selektieren in einer Grafik nicht wirklich geeignet waren. Die Dicke kann man aber nicht einstellen, da sie eine Eigenschaft des eingestellten Style sind.

Uwe

Auswahlbereich festlegen

Verfasst: 23. Oktober 2006 10:05
von stevy
Hallo Uwe,
vielen Dank für deine Antwort.
Leider kann ich deine Bibliothek nicht dazulinken, weil die Leute hier etwas ängstlich sind bezüglich neuer Bibliotheken.

Immerhin habe ich mir jetzt ein Auswahlrechteck gebastelt (mittels MousePress, MouseMove, MouseRelease). Wie kann ich jetzt dem Canvas bzw. CanvasView mitteilen, dass er nur dieses Rechteck, und zwar auf die ganze Größe gezoomt, anzeigen soll?
Ich seh nicht richtig durch bei diesen Klassen. Muss ich die worldmatrix bearbeiten?

Grüße, Stevy