QWidget - Repaint
Verfasst: 2. Dezember 2009 18:28
Hallo zusammen,
ich bin gerade dabei mir einen Splash-Screen zu basteln. Dazu hab ich einfach eine von QWidget abgeleitete Klasse erstellt, die ich vor meinem MainWindow anzeige.
Das ganze passt auch soweit bis zu folgendem Punkt:
In meiner Splash-Klasse habe ich eine Methode startup(), die ich zum Schluss im Konstruktor aufrufe.
Diese Methode soll ein paar Dinge erledigen, bevor das Programm angezeigt wird. Nebenbei wird halt auch eine ProcessBar und ein Label aktualisiert.
Zwischen den einzelnen Schritten brauche ich immer wieder ein sleep, damit der Splash nicht zu schnell fertig ist.
Dafür benutze ich den QTimer:
Meine startup-Methode sieht jetzt also zB. so aus:
Mein Problem ist nun, dass die Oberfläche anscheinend nicht aktualisiert wird, während der Timer läuft.
Nun wird mein Widget erst sichtbar, wenn alle waits beendet sind, dh. ich sehe zum Schluss nur 100% und den letzten Status-Text, bevor die Methode fertig ist und mein MainWindow "startet".
Danke, mfg
mik
Gleich vorweg:
1) Ich verwende QTest::qSleep deshalb nicht, weil ich in "weiser Voraussicht" eine eigene Klasse mit dem Namen QTest in meinem Projekt erstellt habe und diese nicht ändern will...
2) Ich hab auch überlegt meine Klasse von QSplashScreen abzuleiten, sehe darin aber keinen wirklichen Vorteil bzw. stört es mich sogar, dass der Splash dann bei Mausklick automatisch verschwindet (was man natürlich auch abfangen könnte...).
ich bin gerade dabei mir einen Splash-Screen zu basteln. Dazu hab ich einfach eine von QWidget abgeleitete Klasse erstellt, die ich vor meinem MainWindow anzeige.
Das ganze passt auch soweit bis zu folgendem Punkt:
In meiner Splash-Klasse habe ich eine Methode startup(), die ich zum Schluss im Konstruktor aufrufe.
Diese Methode soll ein paar Dinge erledigen, bevor das Programm angezeigt wird. Nebenbei wird halt auch eine ProcessBar und ein Label aktualisiert.
Zwischen den einzelnen Schritten brauche ich immer wieder ein sleep, damit der Splash nicht zu schnell fertig ist.
Dafür benutze ich den QTimer:
Code: Alles auswählen
void SplashScreen::on_timer()
{
m_bNextWaitFinished = true;
}
void SplashScreen::wait(int iMsToWait)
{
m_bNextWaitFinished = false;
QTimer::singleShot(iMsToWait, this, SLOT(on_timer()));
while (!m_bNextWaitFinished)
QApplication::processEvents();
}Code: Alles auswählen
void SplashScreen::startup()
{
m_ui->progressBar->setValue(0);
m_ui->lblStatus->setText(tr("Downloading database..."));
wait(1000);
m_ui->progressBar->setValue(20);
m_ui->lblStatus->setText(tr("Opening database..."));
wait(1000);
//...Nun wird mein Widget erst sichtbar, wenn alle waits beendet sind, dh. ich sehe zum Schluss nur 100% und den letzten Status-Text, bevor die Methode fertig ist und mein MainWindow "startet".
Danke, mfg
mik
Gleich vorweg:
1) Ich verwende QTest::qSleep deshalb nicht, weil ich in "weiser Voraussicht" eine eigene Klasse mit dem Namen QTest in meinem Projekt erstellt habe und diese nicht ändern will...
2) Ich hab auch überlegt meine Klasse von QSplashScreen abzuleiten, sehe darin aber keinen wirklichen Vorteil bzw. stört es mich sogar, dass der Splash dann bei Mausklick automatisch verschwindet (was man natürlich auch abfangen könnte...).