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