Seite 1 von 1

Animation eines QDockWidgets

Verfasst: 5. Juni 2009 22:10
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

Verfasst: 6. Juni 2009 10:03
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...

Verfasst: 6. Juni 2009 11:15
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

Verfasst: 6. Juni 2009 13:44
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.

Verfasst: 6. Juni 2009 13:59
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.

Verfasst: 6. Juni 2009 15:11
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