Seite 1 von 1

Update, Repaint ? - Probleme beim Neuzeichnen

Verfasst: 28. April 2007 12:05
von Brownie
Hallo,

ich habe mal ein paar Fragen zum Neuzeichnen von Fenstern:

1) Ich habe ein QGraphicsView-Fenster, das eine QGraphicsScene a hat. Nun möchte ich über einen Slot, eine andere QGraphicsScene b ins GraphicsView-Fenster laden. QGraphicsScene a soll dabei aber nicht gelöscht werden, da sie später noch benötigt wird.

Bei folgendem Code wird die alte Scene nur übermalt und an den Teilen, wo nichts neues drüber gezeichnet wird, scheint die alte Scene halt durch.

Code: Alles auswählen

setScene(b);
repaint();
qApp->processEvents();
Gibt es eine Möglichkeit, das GraphicsView-Fenster quasi zurückzusetzen und dann eine Szene neu zu setzen?


2) Im zweiten Fall habe ich ein TabWidget, in dem oben ein Formularfeld zum Hinzufügen eines Widgets vorhanden ist und unten eine Liste von Widgets zum Editieren von Daten. Wenn man in dem Formular ein Widget hinzufügt, sollte es sofort unten erscheinen und die Liste bzw. das ganze Fenster aktualisiert werden. Im Moment mache ich es so, dass ich beim Hinzufügen eines Widgets per Formular das Layout des TabWidgets lösche und neu erstelle, aber das TabWidget wird dadurch nicht neu gezeichnet.

Ich habe jetzt schon repaint() und update() ausprobiert (auch mit qapp->processEvents() ), aber das TabWidget wird einfach nicht aktualisiert.

Wenn ich den Dialog mit dem TabWidget schließe und neu öffne, ist das neu eingefügte Widget aber vorhanden.

Hat jemand einen Tipp, wie ich die Widgets aktualisieren kann?

Verfasst: 28. April 2007 12:29
von upsala
Ich denke der komplette Code wäre nicht schlecht.

Verfasst: 28. April 2007 13:35
von Brownie
Ich denke der komplette Code wäre nicht schlecht.
Puh, also der komplette Code ist zuviel, um ihn hier reinzustellen und da müsste ich einiges zum Sinn und Zweck der Klassen erklären. Ich versuch das mal auf ein paar Codestücke zu reduzieren:


Zu 1)

Folgender Slot soll die Szenen austauschen.

EditWidget ist abgeleitet von QGraphicsView.

Code: Alles auswählen

void EditWidget::changeActiveBehavior()
{
	QGraphicsScene *s = behaviorFile->getActiveBehaviorObject()->getScene();
	setScene(s);
	repaint();
	qApp->processEvents();
}
Ich habe ein DockWidget mit einer Liste von Instanzen der Klasse BehaviorObject. Diese enthalten jeweils eine QGraphicsScene als Membervariable. Wenn nun ein Eintrag der Liste aktiviert wird, soll die Szene des BehaviorObjects geladen werden. Die MemberScene des vorherigen BehaviorObject soll aber natürlich nicht gelöscht werden.

Was bei mir passiert sind nun folgende zwei Fälle:
1) Man klickt auf den Listeneintrag und es passiert nichts. Wenn man das Fenster allerdings etwas größer zieht wird es aktualisiert und die richtige Szene geladen.
2) Die Scene wird zwar geladen, aber über die vorherige drübergezeichnet, was ziemlich unschön aussieht. Auch hier kann man durch vergrößern des QGraphicsView-Widgets das Aktualisieren erzwingen.

Was ich gerne wissen würde, ist eigentlich nur, wie ich eine Scene im GraphicsView vernünftig wechsle.

Verfasst: 28. April 2007 16:22
von Brownie
Hi,
Problem 2) habe ich gerade behoben.
Der Fehler lag darin, dass ich ein Widget neu erstellt hatte, was noch in einem Layout eingebunden war.
Wenn man das alte Widget aus dem Layout rausnimmt, löscht und ein neues erstellt und ins Layout wieder einfügt und dann repaint() aufruft, gehts...