2013-02-15 4 views
16

Ich habe PyQt schon eine ganze Weile benutzt und die gesamte Zeit, die ich damit verbracht habe, gab es ein ziemlich konsistentes Programmiermuster.Wie lädst du .ui-Dateien in Python-Klassen mit PySide?

  1. Verwenden Sie Qt Designer zum Erstellen einer .ui-Datei.
  2. Erstellen Sie eine Python-Klasse des gleichen Typs wie das Widget, das Sie in der .ui-Datei erstellt haben.
  3. Wenn Sie die Python-Klasse initialisieren, verwenden Sie uic, um die .ui-Datei dynamisch in die Klasse zu laden.

Gibt es eine Möglichkeit, etwas ähnliches in PySide zu tun? Ich habe die Dokumentation und die Beispiele gelesen und das nächste, was ich finden konnte, war ein Taschenrechner-Beispiel, das die .ui-Datei in Python-Code vorbereitete, was die super alte Art ist, es in PyQt zu machen wenn du das UI einfach parsen kannst?)

+0

Ich war es immer dachte, besser einen ganzen Parsing Schritt vom Start der Anwendung zu entfernen, und das mit Die dynamische Last war eher ein Entwicklungsvorteil. – jdi

+0

@jdi "Besser" ist subjektiv. Etwas schneller ... vielleicht ..., Es ist nicht so, dass der Python-UI-Code nicht geparst werden muss, sondern lediglich eine Art von Syntaxanalyse für eine andere verwendet wird. Einer der wichtigsten Vorteile von pyqt ist der schnelle iterative Entwicklungs-Workflow. PySide fügt einen weiteren Schritt hinzu, geht IMHO zurück. –

+0

Ich stimme Ihrer Korrektur zu. Ich hätte es so formulieren sollen: "Ich persönlich habe es gerade einfacher gefunden". Und ich denke, dass es beim dynamischen Laden sowieso mehr Parsing gibt. Sie müssen zuerst den XML-Code der Benutzeroberfläche -> Python analysieren und konvertieren und dann die Objekte daraus erstellen. – jdi

Antwort

20

Ich mache genau das mit PySide. :)

Mit diesem https://gist.github.com/cpbotha/1b42a20c8f3eb9bb7cb8 (original von Sebastian Wiesner war bei https://github.com/lunaryorn/snippets/blob/master/qt4/designer/pyside_dynamic.py aber verschwunden ist) - die PySide.QtUiTools.QUiLoader außer Kraft gesetzt und liefert eine neue loadUi() Methode, so dass Sie dies tun können:

class MyMainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 
     loadUi('mainwindow.ui', self) 

Wenn Sie MyMainWindow instanziieren, verfügt es über die Benutzeroberfläche, die Sie mit dem Qt Designer entworfen haben.

Wenn Sie auch eigene Widgets verwenden müssen („fördern“ in Qt-Designern), diese Antwort sehen: https://stackoverflow.com/a/14877624/532513

+0

Hallo zusammen. Der Link zu GitHub scheint kaputt zu sein. –

+0

Danke für das Heads-Up! Ich habe meine eigene modifizierte Version von pyside_dynamic.py als einen Kern zur Verfügung gestellt, siehe die modifizierte Antwort. –