Использование QTDesigner с PyQT и Python 2.6 - PullRequest
20 голосов
/ 22 марта 2010

Я новичок в Python и начинаю учиться программированию GUI (надеюсь) с использованием PyQT4.7 и Python 2.6

Я только что загрузил весь пакет PyQT / QT4 (включая QTDesigner) с веб-сайта PyQT, однако он выглядит как QTDesigner, который выглядит потрясающе для использования в качестве новичка (поскольку вы можете видеть все атрибуты / свойства / значения по умолчанию и т. Д.) Каждого виджет и визуальное редактирование свойств - это замечательно, но PyQT, похоже, не настраивает QTDesigner для непосредственной интеграции со скриптами генерации кода Python PyQT и PyQTs:

Т.е.: нажимая «Просмотр кода», пытается запустить скрипт Designer-> C ++ с именем (uic) вместо скрипта pyuic.py и т. Д.

Есть ли способ заставить QTDesigner тесно интегрироваться с PyQT для генерации кода на лету, как это происходит с C ++?

Если нет, значит ли это, что мне нужно кодировать весь графический интерфейс QT в моей Python IDE и искать всю документацию и шаблонный код для каждого виджета? (кажется очень неэффективным и не элегантным по сравнению с простой интеграцией QTDesigner + Python).

Каков обычный набор инструментов // производственный процесс использования Designer с PyQT? (Если прямая интеграция невозможна - пользователи python + pyQT просто пропускают все вместе, используя QTDesigner, и вручную пишут весь код QT GUI на python?)

Будем благодарны за любые дополнительные советы / предложения для новичка в PyQT. Спасибо!

ps. Я знаю, что многие из вас, вероятно, скажут мне просто смириться с этим и вручную написать весь пользовательский интерфейс QT, но если я использую Designer во время обучения, как указано выше, пожалуйста, предоставьте способ сделать это, чтобы я можно научиться легче, спасибо!

Ответы [ 4 ]

20 голосов
/ 24 марта 2010

Я начал писать свое первое приложение PyQT (PyQT используется только для обработки графического интерфейса), и кажется, что хорошим набором инструментов является: QtDesigner для генерации .ui s и обработки ресурсов и некоторая IDE, которая может установить QtDesigner для редактирования этих , Я использую Eclipse, потому что он очень настраиваемый. Вы можете скомпилировать ваши .qrc и .ui по требованию, выполнив что-то вроде этого при запуске приложения, или при настройке, или в любое другое время:

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

и последующее использование сгенерированных классов следующим образом:

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)

или вы можете загрузить .ui напрямую, когда контейнерные единицы:

    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

обратите внимание, что я добавил суффикс UI к имени файла .ui, это было сделано, чтобы избежать пересечения имен, поскольку имя файла .py, генерируемого uic, не является именем класса, начинающимся с 'Ui_', а просто корневым виджетом один.

И еще одно замечание: в конце сгенерированного файла uic помещает строку 'import% .qrc name% _rc' (по умолчанию - import images_rc), поэтому вы должны это учитывать при использовании pyrcc4.

Весь подход достаточно гибок, он берет на себя всю фиктивную работу по программированию пользовательского интерфейса; но вы все еще можете выполнить тонкую настройку в атрибуте MyMainWindow.ui, где лежит экземпляр Ui_MyMainWindow; и это позволяет избежать ненужного наследования. Лично я делаю методы _connectSlots и _initIntefrace в MyMainWindow, чтобы не мог работать какой-то дизайнер.

Тем не менее, я должен отметить, что написание кода интерфейса самостоятельно - хороший подход, потому что код, сгенерированный uic, является УГРОМНЫМ. Из-за этого я предпочитаю загружать .ui на место с помощью loadUi () :) И если у вас есть много пользовательских элементов управления PyQT, это так здорово - перенести их в QtDesigner ..

2 голосов
/ 20 ноября 2012

Я сделал свой собственный исполняемый файл uic, который является оберткой для скрипта pyuic.py.

Вам понадобится ...

  1. Чтобы получитьи установите py2exe

  2. Замените PYTHON_PATH в коде uic.py ниже

  3. Отредактируйте файл qt.conf вsite-packages \ PyQt4 и set Binaries = Путь к папке, содержащей исполняемый файл uic, как только он будет создан.

  4. Поместите uic.py и setup.py в одну папку

  5. В командной строке перейдите к папке, где setup.py иЗатем uic.py запускают следующую команду «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"]}})
1 голос
/ 22 марта 2010

Вы можете запустить pyuic (или, скорее, pyuic4) вручную, в своей консоли. Вы можете создать свой графический интерфейс, используя конструктор с Python, так же, как вы делали бы это с C ++.

Между прочим: я написал все графические элементы для своего приложения (10 КБ кода) вручную. Мне не очень нравятся дизайнеры GUI и работа с сгенерированным кодом, когда нужно что-то подправить.

0 голосов
/ 29 августа 2010

QtDesigner использует uic.exe для генерации кода C ++ на лету. uic.exe - инструмент командной строки, он получает имена файлов в качестве входных параметров. Для интеграции с python вы можете написать программу на python, которая использует pyuic.py, сопоставить ее входные данные с вводом uic.exe (порядок, переключатели и т. Д.), Преобразовать его в исполняемый файл (используя py2exe) и переименовать исполняемый файл в uic.exe. затем замените его на uic.exe в каталоге bin Qt (uic.exe, как я знаю, в PyQt не существует). Вы должны быть осторожны с входными аргументами uic.exe и вашим рукописным макросом (они должны совпадать).

Я думаю, что вашей программе нужно знать путь к Python (чтобы использовать pyuic). Если вы используете Windows, вы можете получить путь из реестра.

...