Animation eines QDockWidgets

Alles rund um die Programmierung mit Qt
Antworten
zapata
Beiträge: 5
Registriert: 4. Juni 2009 23:01

Animation eines QDockWidgets

Beitrag von zapata »

Hallo ForumLeute,

bin ziemlich neu in der QT-Programmierung und will auf Knopdruck ein DockWidget "aus der Bildschirmseite herausfahren lassen".

Mein Vorgehen war bis jetzt:

- mein Mainwindow hat einen Slot openDock() bekommen
- ein Knopf (Pushbutton) hab ich per connect und dem Signal pressed mit openDock verbunden
- in dem openDock-Slot verwende ich die die Funktion move() von Widget und wollte bis zur Maximumwidth von dem QDockWidget das ding eben rausfahren lassn

Allerdings schiebt sich da nur ein Teil des Widget nach aussen (hier: nach links). Habe auch probiert den Content mit zu moven, aber hat sich nichts getan... Hat jemand ne Idee?

Mein Code:

Code: Alles auswählen

void
MainWindow::openDock()
{
	int i=0;
	for(i;i < (ui->dW_right->maximumWidth());i++)
	{
		ui->dW_right->move(840,19);
		ui->dockWidgetContents->move(840,19);

	}
	

}
dW_right is mein Dockwidget.

Danke und gruesse
Zuletzt geändert von zapata am 6. Juni 2009 14:00, insgesamt 1-mal geändert.
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag von Strahlex »

1. den Iterator kannst du auch direkt in der Schleife definieren:
2. wieso maximumWidth und nicht die jetztige Größe (width)
3. du verschiebst das Dockwidget immer an die gleiche Position
4. damit das ganze animiert aussieht musst du die Schleife langsamer durchlaufen lassen (QTime)

Code: Alles auswählen

void
MainWindow::openDock()
{
   QTime time;
   time.start();
   for (int i = 0; i <= (ui->dW_right->width()); ++i)
   {
      while (time.elapsed() < i*10)
         qApp->processEvents();

      ui->dW_right->move(840 - i, 19);
      ui->dockWidgetContents->move(840 - i,  19);
   }
   

}
Hab den Code nocht getestet, sollte aber funktionieren...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Code: Alles auswählen

void
MainWindow::openDock()
{
   QTime time;
   time.start();
   for (int i = 0; i <= (ui->dW_right->width()); ++i)
   {
      while (time.elapsed() < i*10)
         qApp->processEvents();

      ui->dW_right->move(840 - i, 19);
      ui->dockWidgetContents->move(840 - i,  19);
   }
   

}
Ich halte das "while time.elapsed()" für problematisch, weil du dermaßen oft processEvents() aufrufst...
Für so was gibt es QTimer.
Entweder eigenen Timer als member verwenden, oder in nem SLOT immer wieder QTimer::singleshot() mit jenem Slot aufrufen (bsp. "nextAnimStep()"), so lange bis die ANimation fertig ist.
Oder gleich den QObject-eigenen Timer mit startTimer() anstoßen, und das timerEvent() implementieren (dort dann die Animation durchführen).

Grüße
Franz
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag von Strahlex »

franzf hat geschrieben:

Code: Alles auswählen

Ich halte das "while time.elapsed()" für problematisch, weil du dermaßen oft processEvents() aufrufst...
Für so was gibt es QTimer.
Entweder eigenen Timer als member verwenden, oder in nem SLOT immer wieder QTimer::singleshot() mit jenem Slot aufrufen (bsp. "nextAnimStep()"), so lange bis die ANimation fertig ist.
Oder gleich den QObject-eigenen Timer mit startTimer() anstoßen, und das timerEvent() implementieren (dort dann die Animation durchführen).
[/quote]
Die vielen processEvents() sollten im Prinzip kein Problem darstellen (wenn man einen Splashscreen eine gewisse Zeit offen lassen will muss mans ja auch  so machen), aber der Timer ist sicher die bessere Lösung.
zapata
Beiträge: 5
Registriert: 4. Juni 2009 23:01

Beitrag von zapata »

Heyho,

danke für die schnellen und informativen Antworten.

Ich weiss dass ich es immer an eine Stelle schiebe, zum Testen hatte ich die Animation noch weggelassen, das stimmt :)

Es ging mir auch in erster Linie darum, dass sich das QDockWidget eben nicht ganz nach links bewegt, sondern nur diese "Anfassleiste zum ziehen" ....

Wenn ich wieder am Notebook arbeite schicke ich mal einen screenshot.
Trotzdem werde ich die vorgeschlagenen Methoden mal probieren.

Noch jemand Ideen woran das liegen könnte? Ob es daran liegt daß ich diesen Slot von ausserhalb der gui aufrufe ?

gruesse

edit:

achja und MaximumWidth() da eben nur bis zur maximal möglichen Breite (das dock widget soll nicht breiter werden als sein content) gemoved werden soll.
zapata
Beiträge: 5
Registriert: 4. Juni 2009 23:01

Beitrag von zapata »

Habe eine ganz einfache Möglichkeit "gefunden", die Schleife war nat. erstmal unnütz ^^ (zunächst ohne Animation):

Code: Alles auswählen

...
ui->dW_right->move(840,19);
ui->dW_right->resize(ui->dW_right->maximumWidth(),ui->dW_right->maximumHeight());

..
allerdings tritt nun ein weiterer Fehler auf.
Das Dockwidget wird auf Knopfdruck mit vollen Funktionen wie es sein soll angezeigt, allerdings kann man das gesamte Widget nocheinmal "herausziehen" ???
Hat jemand da mit Erfahrung?Jemand ne Idee woran das Überlagern liegt? Ich haenge ein Screenshot ran

Gruesse
und thx
Dateianhänge
dock.jpg
dock.jpg (30.05 KiB) 2894 mal betrachtet
Antworten