Korzystanie z QTDesigner z PyQT i Python 2.6

Jestem nowy w Pythonie i zaczynam uczyć się programowania GUI (mam nadzieję) przy użyciu PyQT4. 7 i Python 2.6

Właśnie pobrałem cały pakiet PyQT / QT4 (w tym QTDesigner) ze strony PyQT, jednak wydaje się, że QTDesigner, który wygląda niesamowicie w użyciu jako początkujący (ponieważ można zobaczyć wszystkie atrybuty/właściwości / domyślne itp.) każdego widżetu i wizualnie edytować właściwości jest świetny, ale PyQT wydaje się nie ustawić QTDesigner do integracji bezpośrednio z PyQT i PyQTs python Skrypty generujące kod:

Tzn.: wciskając "View Code", próbuje uruchomić skrypt Designer - > C++ o nazwie (uic) zamiast pyuic.py skrypt itp.

Czy istnieje sposób, aby qtdesigner zintegrować ściśle z PyQT do generowania kodu w locie, jak to ma miejsce w C++?

Jeśli nie, czy to oznacza, że muszę zakodować cały interfejs QT w moim IDE Pythona i przeszukać całą dokumentację i Kod boilerplate dla każdego widżetu? (wydaje się bardzo nieefektywne i nieeleganckie w porównaniu do integracja z Qtdesignerem+Python).

Jaki jest zwyczajowy przepływ narzędzi / / produkcji przy użyciu Designera z PyQT? (Jeśli nie jest możliwa bezpośrednia integracja-czy użytkownicy Pythona+pyQT po prostu pomijają korzystanie z QTDesigner i ręcznie zapisują cały kod Qt GUI w Pythonie?)

Wszelkie dodatkowe wskazówki/sugestie dotyczące nowicjusza PyQT będą mile widziane. Dzięki!

Ps wiem, że banda z Was pewnie powie mi, żebym po prostu podlizał się i kodował cały interfejs QT ręcznie, ale jeśli użyj projektanta podczas nauki, jak wspomniano powyżej, proszę podać sposób, aby to zrobić, abym mógł się go łatwiej nauczyć, dzięki!

Author: gruszczy, 2010-03-22

4 answers

Zacząłem pisać swoją pierwszą aplikację PyQT (PyQT służy tylko do obsługi GUI) i wydaje się, że dobrym toolchainem jest: QtDesigner do generowania.interfejs użytkownika i obsługa zasobów oraz niektórych IDE, które mogą ustawić QtDesigner do ich edycji. Używam Eclipse, ponieważ jest wysoce konfigurowalny. Możesz skompilować swoje .qrc i .interfejs użytkownika na żądanie, robiąc coś takiego podczas uruchamiania aplikacji, konfiguracji lub w dowolnym innym czasie:

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

A następnie używając wygenerowanych klas w ten sposób:

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)

Lub możesz załadować .interfejs użytkownika bezpośrednio, gdy kontener 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

Uwaga, że dodałem sufiks UI do .nazwa pliku ui, zrobiono to, aby uniknąć przecięcia nazwy, ponieważ nazwa pliku. PY, generowana przez uic, nie jest nazwą klasy zaczynającą się od 'Ui_', ale tylko root widget ' s jeden.

I jeszcze jedna uwaga: na końcu wygenerowanego pliku UIC places 'import %.QRC name%_rc' (domyślnie jest to import images_rc) string, więc musisz o tym pamiętać podczas korzystania z pyrcc4.

Całe podejście jest wystarczająco elastyczne, wymaga wszystkie atrapy kodowania UI działają od ciebie; ale nadal możesz zrobić pewne dostrojenie w MyMainWindow.atrybut ui, gdzie znajduje się instancja Ui_MyMainWindow; i unika niepotrzebnego dziedziczenia. Osobiście wykonuję metody _connectSlots i _initIntefrace w MyMainWindow, aby wykonać jakąś pracę, której projektant nie może.

Muszę jednak zauważyć, że samodzielne pisanie kodu interfejsu jest dobrym podejściem, ponieważ kod generowany przez uic jest brzydki. Wolę załadować .ui w miejscu przez loadUi () z tego powodu:) i jeśli mają wiele niestandardowych kontrolek PyQT, jest tak booooring, aby wprowadzić je do QtDesigner..

 20
Author: Maxim Popravko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 05:22:22

Zrobiłem własny plik wykonywalny uic, który jest wrapperem dla pyuic.py scenariusz.

Będziesz potrzebował...
  1. Aby pobrać i zainstalować py2exe

  2. Zastąp PYTHON_PATH w uic.py kod poniżej

  3. Edytuj qt.plik conf w site-packages \ PyQt4 i ustaw Binaries = ścieżka do folderu zawierającego uic exe po jego utworzeniu.

  4. Put uic.py oraz setup.py w tym samym folderze

  5. W wierszu polecenia przejdź do folderu, w którym setup.py oraz uic.py następnie uruchom następujące polecenie "python setup.py 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"]}})
 2
Author: WithMetta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-19 20:16:49

Możesz uruchomić pyuic (a raczej pyuic4) z ręki, w konsoli. Możesz stworzyć swój GUI za pomocą designera z Pythonem, tak jak zrobiłbyś to z C++.

Przy okazji: napisałem wszystkie rzeczy GUI dla mojej aplikacji (10K kodu) ręcznie. Nie lubię projektantów GUI i pracy z wygenerowanym kodem, gdy trzeba coś poprawić.

 1
Author: gruszczy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 18:11:49

QtDesigner używa uic.exe do generowania kodu C++ w locie. uic.exe jest narzędziem wiersza poleceń, pobiera nazwy plików jako parametry wejściowe. W celu integracji z Pythonem, możesz napisać program Pythona, który używa pyuic.py, dopasować jego wejścia do wejścia uic.exe (kolejność, przełączniki itp.), przekonwertować go na plik wykonywalny (używając py2exe) I zmienić nazwę pliku wykonywalnego na uic.exe. następnie zastąp go uic.exe w katalogu Bin Qt (uic.exe nie istnieje w PyQt jak wiem). Należy tylko uważać na argumenty wejściowe uic.exe i Twoje ręcznie pisane makro (powinny pasować do siebie).

Myślę, że twój program będzie musiał znać ścieżkę Pythona (aby używać pyuic). jeśli używasz systemu windows, możesz uzyskać ścieżkę z rejestru.

 0
Author: sorush-r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-29 18:22:14