Aktion beim anzeigen des Fensters ausführen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Benutzeravatar
Trüffelschwein
User
Beiträge: 12
Registriert: Donnerstag 23. Juni 2011, 08:50

Ich glaube, allmählich steige ich ein wenig dahinter. Und das Problem mit dem setText-Slot habe ich mit etwas Rumprobieren auch gelöst. Ist vielleicht nicht besonders schön, aber es funktioniert :mrgreen:

... eigentlich ganz easy :shock:

Code: Alles auswählen

# Dialogfeldfuellen.py

import sys
from PyQt4 import QtGui, QtCore

class MyDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)

        self.resize(500, 250)
        self.setWindowTitle('DialogFüllen')

        self.Name = QtGui.QLineEdit(self)
        self.Name.setGeometry(10,10,150,20)
        self.Name.setMaxLength(30)
        self.Name.setText('Ich bin ein Demotext')

app = QtGui.QApplication(sys.argv)
main = MyDialog()
main.show()
sys.exit(app.exec_())

deets

Hmja, so halb ;)

Das funktioniert natuerlich so, und insofern - so weit, so gut.

Aber es ist nicht die Art, wie man mit Qt umgeht. Schon vor einigen Jahren hat sich die Erkenntnis durchgesetzt, dass Widgets (wie deinen Dialog) durch Ableitung zu bauen eine unschoene Verquickung von Logik & Layout bedeutet.

Darum erzeugt der Qt-Designer inzwischen ja auch reine resource-files in XML-Form, und die kann man sogar wenn man will zur Laufzeit erst interpretieren lassen.

Dementsprechend hast du den Konstruktor nicht zur Verfuegung fuer das befuellen der Daten.

Also saehe der Code eher so aus:

Code: Alles auswählen

dlg = MyDialog()
dlg.findChild("Name").setText("demotext")
Dann kannst du zB das "Name"-widget in einen anderen Container packen, und der code wuerde immer noch funktionieren.
Benutzeravatar
Trüffelschwein
User
Beiträge: 12
Registriert: Donnerstag 23. Juni 2011, 08:50

Klar, das macht die Sache flexibler und trennt die Gui sauber vom Business-Layer. Mein Code stammt überwiegend von einem PyQt-Tutorial, das ich auf unser Diskussionsthema angepasst habe. Da hat man das wohl noch auf einer simplen Alles-in-einer-Datei-Schiene gelassen, um die Newbies nicht zu verwirren :D .

Aber eine Frage zum Verständnis:
Wenn ich dieses Paradigma (Trennung von Logik und Layout) konsequent anwende, dann würde ich alle Logik-Einstellungen (wie zB die Textvorbelegung) in Child-Verweise packen und das am besten von einer Datei aus aufrufen, die zum Businesslayer gehört und die ich in der PyQt-Datei inkludiere, während alle Layouteinstellungen (Größe, Font, Farbe) durchaus im Konstruktur der Fenster-Klasse angesiedelt werden. Sehe ich das richtig oder drehe ich jetzt ab :? ?
deets

Fast richtig. Zum einen kommen diese Voreinstellungen eigentlich nicht mehr so direkt vor - die sind ja im Designer erstellt.

Und zum anderen redest du davon, die Logik zum befuellen des Dialoges *innerhalb* seiner Klasse irgendwie anzuziehen. Und das ist natuerlich nicht richtig.

Stattdessen wirst du ja eine Controller-Schicht oAe haben, und da entscheidest "ok, ich brauch' jetzt den und den Dialog, und befuelle den mit diesen Daten hier".
Pacnos
User
Beiträge: 19
Registriert: Sonntag 8. Mai 2011, 20:17

Hättest du da vieleicht ein kleines Beispiel deets, wo auch diese Sache mit den XML Dateien erwähnt wird?
Benutzeravatar
Trüffelschwein
User
Beiträge: 12
Registriert: Donnerstag 23. Juni 2011, 08:50

deets hat geschrieben:Stattdessen wirst du ja eine Controller-Schicht oAe haben, und da entscheidest "ok, ich brauch' jetzt den und den Dialog, und befuelle den mit diesen Daten hier".
Right :D
Klassisches Beispiel: Die Maske zum Erfassen, Ändern oder Löschen von Datensätzen.
Die Maske ist immer die Gleiche. Die Controllerfunktion in der Business-Schicht ruft sie auf und befüllt die Felder mit Daten, wenn der Datensatz geändert oder gelöscht werden soll. Bei Neueingabe lässt sie die Fields selbstverständlich leer.
Antworten