"StartupWindow"

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Vielen Dank!
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

jetzt habe ich folgendes Problem (wiedermal :D):
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()
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?
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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 :P

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 :)
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

OK, ich hab das mal gemacht:

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_()
Bei Fragen einfach melden.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
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..
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Leonidas hat geschrieben:
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
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..
Das war auch mein erster Gedanke ;)
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)
wird klar dass es nimmer geht. Halt ich für ziemlich schwer, die Texte so zu verschmelzen, dass der eine Teil links unten steht, und der andere rechts unten.

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 :)
Antworten