Seite 1 von 1

Items einer Scene das gesamte Fenster ausfüllend darstellen?

Verfasst: 10. Oktober 2008 09:24
von kert
hi leute,

ich habe ein problem mit meinem qgraphicsview bzw. qgraphicsscene. ich erzeuge meine szene immer wieder dynamisch, indem ich sie lösche (MyGraphicsScene.clear()) und neue qgraphicsitems (z.b. MyGraphicsScene.addLine(xLine)) hinzufüge. ich möchte allerdings, dass mein szeneninhalt immer zentriert und so angezeigt wird, dass das gesamte fenster damit ausgefüllt ist. da meine items mal kleiner und mal größer sein können, bringt mir ein einheitlicher skalierungsfaktor wenig.

ich habe bereits folgendes probiert:

Code: Alles auswählen

ui.GraphicsView->fitInView(x, y, w, h, Qt::KeepAspectRatio);
ui.GraphicsView->setSceneRect(x, y, w, h);

wobei x=0.0, y=0.0 und die höhe und die breite meist zwischen 0 und 1 liegen, da meine qgraphicsitems in diesem bereich liegen. leider funktioniert das nicht so, wie ich es erwarte. ich habe bisher noch keine lösung gefunden und hoffe, ihr könnt mir weiterhelfen bzw. vielleicht hattet ihr ja bereits dasselbe problem. habe im forum dazu nichts passendes gefunden.

vielen dank. k.

Verfasst: 10. Oktober 2008 11:14
von Volker
Weiß nicht sicher, ob Dir das weiterhelfen könnte, aber ich hatte gestern ein ähnliches Problem und bei mir hat geholfen, das Scene Rect des Views NICHT zu setzen, sondern stattdessen das Scene Rect der Szene.

Verfasst: 10. Oktober 2008 11:32
von mathies
Hallo,

ich weiß nicht ob es dafür direkt ne Funktion gibt, ich hab es selber gerechnet über die aktuellen Skalierungsfaktoren des GraphicsView

Code: Alles auswählen

// aktuellen Scalingfaktor auslesen
XScale = view->matrix().m11();
YScale = view->matrix().m22();
Dann muss nur das Vehältnis von Deiner Scene zum GraphicsView bestimmen über das SceneRect, BoundingRect oder was Du auch immer vollständig dargestellt haben willst. Dann setzt einfach den neuen Skalierungsfaktor. Je nachdem ob Du die Höhe oder Breite anpassen musst

Code: Alles auswählen

// wenn die Scene höher ist als breit
scaleToSet = (1 /YScale);
view->scale( scaleToSet , scaleToSet );
Hoffe des hilft bissl.

Verfasst: 10. Oktober 2008 14:39
von kert
hi und danke ihr zwei,

wenn ich es so mache:

Code: Alles auswählen

  double xScale = ui.gvFilletView->matrix().m11();
  double yScale = ui.gvFilletView->matrix().m22();
  ui.gvFilletView->scale(xScale, yScale);
sind xScale und yScale meist 1.0
die ansicht verändert sich zwar, aber meine items liegen noch immer nicht zentriert im fenster bzw. sind zu klein oder zu groß. wenn ich einmal ein großes objekt erzeugt habe, bekommt mein view scrollbalken, die ich dann auch nicht mehr wegbekomme...
wenn ich das ganze mit

Code: Alles auswählen

MyGraphicsScene.setSceneRect(x, y, w, h);
kombiniere, liegen meine items (bei vergrößerung) immer weiter ausserhalb des sichtbereiches (bewegt sich immer weiter noch oben).

wenn ich stattdessen vor der skalierung:

Code: Alles auswählen

ui.GraphicsView->fitInView(x, y, w, h, Qt::KeepAspectRatio);
packe, bekomme ich scrollbalken und irgendwie werden die items nicht richtig angezeigt, wenn ich scrolle... die items werden wie wegradiert, wenn ich das mache... :(

vielleicht noch jemand eine andere idee..?

Verfasst: 10. Oktober 2008 14:46
von mathies
Hi,

Du weißt schon, dass Du die Srollbalken ausschalten kannst, oder?

setVerticalScrollBarPolicy ( Qt::ScrollBarPolicy ) und setHorizontalScrollBarPolicy ( Qt::ScrollBarPolicy ) sind dabei Deine Freunde. Und wenn Du dann noch Qt::ScrollBarAlwaysOff übergibst für Deinen View, dann haste nie welche.

Verfasst: 10. Oktober 2008 14:54
von kert
ja, das weiß ich.

hiermit funktioniert es zumindest erstmal, dass mein item immer ungefähr gleich groß bleibt

Code: Alles auswählen

ui.GraphicsView->fitInView(-w, -h, 2*w, 2*h, Qt::KeepAspectRatio);
ui.GraphicsView->centerOn(0.0, 0.0);
leider ist mein objekt noch immer nicht zentriert im fenster und füllt es komplett aus... ich dachte, funktionen wie: centerOn oder ensureVisible würden mir da weiterhelfen, aber irgendeine einstellung scheint noch zu fehlen. wenn ich momentan die parameter meines items ändere, springt der item im view rum (von links in die mitte oder von der mitte nach unten links)... komisches verhalten...

Verfasst: 13. Oktober 2008 11:50
von kert
es funktioniert jetzt fast...

Code: Alles auswählen

double x = 0.0;
double y = 0.0;
double w = width; // Breite der Boundingbox aller Items
double h = height; // Höhe der Boundingbox aller Items

const double borderDistance = w/3; ///< Abstand des Koordinatensystems vom Rand

MyGraphicsScene.setSceneRect(x-borderDistance, y+borderDistance, w+borderDistance, -h-borderDistance);

ui.GraphicsView->fitInView(MyGraphicsScene.sceneRect(), Qt::KeepAspectRatio);
allerdings erst beim 2. aufruf. ich habe eine combobox in der ich verschiedene formen auswählen kann, die dann dynamisch berechnet werden und als zusammensetzung von liniensegmenten in die szene hinzugefügt werden. es muss aber irgendwie ein signal erst beim 2. aufruf geben, dass dafür sorgt, dass ich meine szene so sehe, wie ich es will.
beim 1. aufruf liegen meine items zwar zentriert in der szene, aber füllen diese nicht komplett aus - also sind relativ klein dargestellt. hat jemand eine idee, woran das liegen kann bzw. welches signal da anscheinend gesendet wird? danke nochmals.