Seite 1 von 2
Re: Aktion beim anzeigen des Fensters ausführen
Verfasst: Freitag 24. Juni 2011, 20:32
von Trüffelschwein
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
... eigentlich ganz easy
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_())
Re: Aktion beim anzeigen des Fensters ausführen
Verfasst: Sonntag 26. Juni 2011, 22:41
von 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.
Re: Aktion beim anzeigen des Fensters ausführen
Verfasst: Montag 27. Juni 2011, 08:22
von Trüffelschwein
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

.
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

?
Re: Aktion beim anzeigen des Fensters ausführen
Verfasst: Montag 27. Juni 2011, 08:48
von 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".
Re: Aktion beim anzeigen des Fensters ausführen
Verfasst: Montag 27. Juni 2011, 20:25
von Pacnos
Hättest du da vieleicht ein kleines Beispiel deets, wo auch diese Sache mit den XML Dateien erwähnt wird?
Re: Aktion beim anzeigen des Fensters ausführen
Verfasst: Dienstag 28. Juni 2011, 00:14
von deets
Re: Aktion beim anzeigen des Fensters ausführen
Verfasst: Mittwoch 29. Juni 2011, 08:15
von Trüffelschwein
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
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.