2010-03-22 11 views
20

ich Python neu bin und fange an, mir GUI-Programmierung zu lehren (hoffentlich) mit PyQT4.7 und Python 2.6Mit QtDesigner mit PyQT und Python 2.6

I (einschließlich QtDesigner nur das ganze PyQT/Qt4-Paket heruntergeladen) von der PyQT-Website, aber es scheint QTDesigner, die erstaunlich aussieht, als Neuling zu verwenden (da Sie alle Attribute/Eigenschaften/Standards usw. sehen können) jedes Widget und visuell bearbeiten Sie die Eigenschaften ist großartig, aber PyQT scheint nicht festgelegt QTDesigner zur direkten Integration mit PyQT- und PyQTs-Python-Codegenerierungsskripten:

ie: "Code anzeigen", versucht, das Designer-> C++ - Skript namens (uic) anstelle des pyuic.py-Skripts usw. auszuführen.

Gibt es eine Möglichkeit, QTDesigner für die Code-Generierung im direkten Kontakt mit PyQT zu integrieren, wie dies bei C++ der Fall ist?

Wenn nicht, bedeutet das, dass ich die gesamte QT-GUI innerhalb meiner Python-IDE codieren muss und die gesamte Dokumentation und den Code für jedes Widget nachschlagen muss? (scheint sehr ineffizient und unelegant im Vergleich zu nur mit QTDesigner + Python Integration).

Was ist der übliche Toolchain // Produktionsablauf bei Verwendung von Designer mit PyQT? (Wenn keine direkte Integration möglich ist - tun Python + pyQT Benutzer überspringen nur mit QTDesigner alle zusammen und schreiben Sie manuell alle QT GUI-Code in Python?)

Alle zusätzlichen Tipps/Vorschläge für ein PyQT-Neuling wäre willkommen. Vielen Dank!

ps Ich weiß, dass ein paar von euch wahrscheinlich sagen werden, dass ich es einfach aufnehme und die gesamte QT UI von Hand code, aber wenn ich Designer wie oben beschrieben benutze, bitte einen Weg, dies zu tun Ich kann es leichter lernen, danke!

Antwort

20

Ich fing an, meine erste PyQT-Anwendung zu schreiben (PyQT wird nur für GUI verwendet), und es scheint, dass gute Toolchain ist: QtDesigner zu generieren .ui s und handhaben Ressourcen und einige IDE, die QtDesigner zu bearbeiten jene. Ich benutze Eclipse, weil es sehr anpassbar ist. Sie können Ihre .qrc und .ui nach Bedarf zusammenstellen etwas bei Start der Anwendung, wie dies zu tun, oder bei der Einrichtung oder jede andere Zeit:

os.system("pyrcc4.exe -o ui/images_rc.py ui/images/images.qrc") 
uic.compileUiDir(appDir + '/ui', True) 

und dann generierten Klassen mit auf diese Weise:

class MyMainWindow(QtGui.QMainWindow): 

    def __init__(self, owner): 
     QtGui.QMainWindow.__init__(self) 
     # 'Ui_MyMainWindow' is the class, that was generated by uic, 
     # naming convention is: 'Ui_' plus the name of root widget in designer 
     self.ui = Ui_MyMainWindow() 
     self.ui.setupUi(self) 

oder Sie können .ui direkt geladen werden, wenn der Behälter inits:

QtGui.QMainWindow.__init__(self) 
    self.ui = None 
    uic.loadUi('MyMainWindowUI.ui', self.ui) 
    #now you have the instance of Ui_MyMainWindow in self.ui too, as above 

Notiz, dass ich UI-Suffix hinzugefügt haben Datei den Namen .ui, es gemacht wurde Namen Kreuzung zu vermeiden, Ursache Name der .py-Datei, die von uic generiert wird, ist kein Klassenname, der mit 'Ui_' beginnt, sondern nur der des ersten.

Und noch eine Anmerkung: am Ende der generierten Datei uic Orte 'Import% .qrc Name% _rc' (standardmäßig ist Import images_rc) Zeichenfolge, so dass Sie dies bei der Verwendung von pyrcc4 beachten müssen.

Der gesamte Ansatz ist flexibel genug, es dauert alle Dummy-UI-Codierung von Ihnen; Sie können jedoch im MyMainWindow.ui-Attribut, wo die Instanz von Ui_MyMainWindow liegt, noch eine Feinabstimmung vornehmen. und es vermeidet unnötige Vererbung. Persönlich mache ich _connectSlots und _initIntefrace-Methoden in MyMainWindow, um etwas Arbeit zu leisten, Designer kann nicht.

Noch muss ich beachten, dass das Schreiben von Interface-Code selbst ist eine gute Annäherung, denn der Code, generiert von UIC, ist UGLY. Ich bevorzuge das Laden von .ui in Ort von loadUi() aus diesem Grund und wenn Sie viele benutzerdefinierte PyQT-Steuerelemente haben, ist es so booooring, um sie in QtDesigner zu bringen.

1

Sie können pyuic (oder besser pyuic4) von Hand, in Ihrer Konsole ausführen. Sie können Ihre GUI mithilfe von Designer mit Python erstellen, genauso wie Sie es mit C++ tun würden.

Übrigens: Ich habe alle GUI-Sachen für meine App (10k Code) von Hand geschrieben. Ich mag GUI-Designer nicht wirklich und arbeite mit generiertem Code, wenn Sie etwas optimieren müssen.

0

QtDesigner verwendet uic.exe, um auf dem zu generieren flieg C++ - Code. uic.exe ist ein Befehlszeilentool, es erhält Dateinamen als Eingabeparameter. Für die Integration mit Python können Sie ein Python-Programm schreiben, das pyuic.py verwendet, Eingaben mit uic.exe Eingabe (Reihenfolge, Schalter usw.), konvertieren Sie es in eine ausführbare Datei (mit py2exe) und benennen Sie die ausführbare Datei in uic.exe. dann ersetze es durch uic.exe in Qt's bin-Verzeichnis (uic.exe existiert in PyQt nicht, wie ich weiß). Sie sollten nur vorsichtig sein mit Eingabeargumenten von uic.exe und Ihrem handgeschriebenen Makro (sie sollten zusammenpassen).

Ich denke, dass Ihr Programm Python-Pfad kennen muss (um Pyuic zu verwenden). Wenn Sie Windows verwenden, können Sie den Pfad von der Registrierung abrufen.

2

Was ich getan habe, war ich meine eigene uic ausführbare Datei, die ein Wrapper für das Skript pjuic.py ist.

Sie benötigen ...

  1. Um py2exe

  2. ersetzen PYTHON_PATH im uic.py Code unter

  3. Bearbeiten Sie die qt.conf Datei in das bekommen und installieren site-packages \ PyQt4 und setze Binaries = Pfad zum Ordner, der die uic exe enthält, sobald sie erstellt wurde.

  4. Put uic.py und setup.py im selben Ordner

  5. In der Eingabeaufforderung navigieren Sie zu dem Ordner, in dem setup.py und uic.py werden dann den folgenden Befehl ein „Python setup.py laufen py2exe ".

//----uic.py

#uic.py 
import subprocess 
import sys 

args = "" 

for arg in sys.argv: 
    if sys.argv[0] != arg: 
     args += arg + " " 


# Start pyuic.py script 
command = 'python %PYTHON_PATH%\\PyQt4\\uic\\pyuic.py '+ args 
out = '' 


child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE) 
complete = False 
while True: 
    out = child.stderr.read(1) 
    if out == '' and child.poll() != None: 
     break 
    if out != '': 
     sys.stdout.write(out) 
     sys.stdout.flush() 

// ----- setup.py

#setup.py  
from distutils.core import setup 
import py2exe 

setup(windows=[{"script":"uic.py"}], options={"py2exe" : {"includes" : ["sip", "PyQt4.QtCore"]}})