Hallo,
ich wollte mal fragen ob es möglich ist bei PyQt4 beim Programm start so ein "Bild" anzuzeigen, bis das Programm vollständig geladen ist. So ähnlich wie bei Adobe Phtoshop.
lg
microkernel
"StartupWindow"
- microkernel
- User
- Beiträge: 271
- Registriert: Mittwoch 10. Juni 2009, 17:27
- Wohnort: Frankfurt
- Kontaktdaten:
QtGui.QSplashScreen?
Schau dir unbedingt in der Doku die Verwendungshinweise an. Am wichtigsten ist das manuelle abarbeiten der Event-Queue (QCoreApplication.processEvents()), sonst gibts bei Änderung keinen neuen Text
Sollte so aber eh alles in der Doku stehen.
Schau dir unbedingt in der Doku die Verwendungshinweise an. Am wichtigsten ist das manuelle abarbeiten der Event-Queue (QCoreApplication.processEvents()), sonst gibts bei Änderung keinen neuen Text

Sollte so aber eh alles in der Doku stehen.
- microkernel
- User
- Beiträge: 271
- Registriert: Mittwoch 10. Juni 2009, 17:27
- Wohnort: Frankfurt
- Kontaktdaten:
Vielen Dank!
- microkernel
- User
- Beiträge: 271
- Registriert: Mittwoch 10. Juni 2009, 17:27
- Wohnort: Frankfurt
- Kontaktdaten:
jetzt habe ich folgendes Problem (wiedermal
):
den SplashScreen initzialisiere ich so:
Anstatt der 2 Meldungen sehe ich nur "Loaded Modules" aber die andere naricht sehe ich nirgendswo auf den SplashScreen. Wie kann man dafür sorgen das eine Naricht auf den SplashScreen stehen bleibt sodass sie nicht gleich bei der nächsten Naricht gelöscht wird?

den SplashScreen initzialisiere ich so:
Code: Alles auswählen
app = QtGui.QApplication([])
pixmap = QtGui.QPixmap("SplashScreen.png")
splash = QtGui.QSplashScreen(pixmap)
splash.show()
splash.showMessage("Version 0.5", QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
app.processEvents()
splash.showMessage("Loaded Modules.", QtCore.Qt.AlignBottom | QtCore.Qt.AlignLeft)
....
splash.finish()
Das ist doch der Sinn eines SplashScreen. Anzeigen, was gerade gemacht wird. Normalerweise zeigst du eine Meldung an "Loading Modules", dann werden die Module geladen. Wenn das fretig ist, kommt ne neue Message. Und genau hier liegt wohl dein Problem, dass die alte Message gelöscht wird.
Das ist ja auch irgendwo der Sinn
Hinzu kommt noch, dass du absolut keine Arbeit verrichtest. Die neue Message kommt so schnell, dass du gar nicht die erste lesen kannst
Wenn du also eine statische Message anzeigen willst, musst du diese entweder fix in dein Pixmap reinmalen, oder du implementierst einen eigenen SplashScreen (natürlich abgelitten von QtGui.QSplashScreen) und verpasst der eine eigene Methode "setStaticMessage()". diese message malst du dann selber im paintEvent(). Ich denke das ist einfacher und flexibler zu handeln als über die manipulierte Grafik
Das ist ja auch irgendwo der Sinn

Hinzu kommt noch, dass du absolut keine Arbeit verrichtest. Die neue Message kommt so schnell, dass du gar nicht die erste lesen kannst

Wenn du also eine statische Message anzeigen willst, musst du diese entweder fix in dein Pixmap reinmalen, oder du implementierst einen eigenen SplashScreen (natürlich abgelitten von QtGui.QSplashScreen) und verpasst der eine eigene Methode "setStaticMessage()". diese message malst du dann selber im paintEvent(). Ich denke das ist einfacher und flexibler zu handeln als über die manipulierte Grafik

OK, ich hab das mal gemacht:
Bei Fragen einfach melden.
Code: Alles auswählen
from PyQt4 import QtGui as qg
from PyQt4 import QtCore as qc
from PyQt4.QtTest import QTest as qt
class Splash(qg.QSplashScreen):
staticMessage_ = ""
def __init__(self):
qg.QSplashScreen.__init__(self)
def setStaticMessage(self, message):
self.staticMessage_ = message
self.update()
def paintEvent(self, event):
qg.QSplashScreen.paintEvent(self, event)
painter = qg.QPainter(self)
pen = qg.QPen( qc.Qt.blue )
painter.setPen(pen)
painter.drawText(20, 20, self.staticMessage_)
app = qg.QApplication([])
mainWin = qg.QLabel("MainWindow")
splash = Splash()
splash.setPixmap(qg.QPixmap("./splash.png"))
splash.setStaticMessage("Version 2.0")
splash.show()
splash.showMessage("Init stage 1 *", qc.Qt.AlignBottom | qc.Qt.AlignRight, qc.Qt.red )
app.processEvents()
qt.qSleep(1000)
splash.showMessage("Init stage 2 **", qc.Qt.AlignBottom | qc.Qt.AlignRight, qc.Qt.red )
app.processEvents()
qt.qSleep(1000)
splash.showMessage("Init stage 3 ***", qc.Qt.AlignBottom | qc.Qt.AlignRight, qc.Qt.red )
app.processEvents()
qt.qSleep(1000)
splash.showMessage("Init stage 4 ****", qc.Qt.AlignBottom | qc.Qt.AlignRight, qc.Qt.red )
app.processEvents()
qt.qSleep(1000)
splash.finish(mainWin)
mainWin.show()
app.exec_()
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wieso so kompliziert? Man kann doch einfach den vorherigen Text nehmen, den neuen Text anhängen und das als neue Nachricht für den Splashscreen anzeigen..franzf hat geschrieben:Wenn du also eine statische Message anzeigen willst, musst du diese entweder fix in dein Pixmap reinmalen, oder du implementierst einen eigenen SplashScreen
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Das war auch mein erster GedankeLeonidas hat geschrieben:Wieso so kompliziert? Man kann doch einfach den vorherigen Text nehmen, den neuen Text anhängen und das als neue Nachricht für den Splashscreen anzeigen..franzf hat geschrieben:Wenn du also eine statische Message anzeigen willst, musst du diese entweder fix in dein Pixmap reinmalen, oder du implementierst einen eigenen SplashScreen

Aber mit diesen Zeilen
Code: Alles auswählen
splash.showMessage("Version 0.5", QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
app.processEvents()
splash.showMessage("Loaded Modules.", QtCore.Qt.AlignBottom | QtCore.Qt.AlignLeft)
Man kann mit einer eigenen Splash-Klasse sogar nen Schritt weiter gehen, und ne Methode anbieten, mit der man den statischen text im Splash platzieren kann, ala showMessage() mit Qt.Alignment.
Aber im Prinzip ist es ja wurscht, hauptsache für die eigenen Bedürfnisse ist es funktional genug
