Zápisník

// Překlad UI a resource souborů v PyQt

PyQt je knihovna pro integraci populární knihovny Qt (u které byla nedávno změněna open-source licence z GPL na LGPL) do Pythonu. Pokud používáte nástroj Qt Designer na návrh uživatelského rozhraní, potřebujete následně přeložit XML popis UI a resourců do kódu pro Python, abyste jej mohli použít.

V C++ variantě Qt je možno jednoduše použít nástroj qmake nebo Automake pro vygenerování příslušného Makefile, který se o překlad do C++ postará. V případě Pythonu není standardně Makefile potřeba, jelikož se moduly kompilují samy při jejich zavádění. S PyQt můžete použít modul uic a XML soubory zkompilovat, nebo je přímo nahrát jako třídy Pythonu.

Alternativně lze použít nástroje do příkazové řádky pyuic4 and pyrcc4 úplně stejně jako jejich originály z knihovny Qt (uic, rcc). Pro své projekty jsem si zvolil tento způsob. Použití nástrojů je jednoduché. Stačí napsat, že chceme přeložit soubor A na soubor B. Příklad následuje.

#compile ui file from Qt Designer
pyuic4 ui_file.ui -o compiled_ui_file.py
#compile resource file (icons, etc..)
pyrcc4 resource_file.qrc -o compiled_resource_file.py

Původně jsem měl jeden jediný shellový skript, který vždy kompiloval všechny soubory najednou (byl jsem příliš líný). Tohle řešení mělo dvě výrazné nevýhody. Jednak kompilace všech souborů sežere nějaký čas, takže tato vlastnost představuje problém v závislosti na množství překládaných resource souborů. Za druhé, a to je pro mě otravnější vlastnost, generátor pyuic4 v hlavičkách vygenerovaného kódu zanechá aktuální čas a datum. Jelikož ze zatím neznámého důvodu uchovávám v Mercurialu i zkompilované verze UI, způsobovalo to pokaždé změnu všech zkompilovaných souboru. Takže jsem osvěžil svoje chabé znalosti tvorby Makefile (a použil taháky z dob minulých) a vytvořil jsem si Makefile pro separátní kompilaci resource souborů.

###### EDIT ##################### 
#Directory with ui and resource files
RESOURCE_DIR = src/resources
 
#Directory for compiled resources
COMPILED_DIR = src/ui
 
#UI files to compile
UI_FILES = confirm.ui main.ui repair.ui settings.ui statistics.ui
#Qt resource files to compile
RESOURCES = images.qrc 
 
#pyuic4 and pyrcc4 binaries
PYUIC = pyuic4.bat
PYRCC = pyrcc4
 
#################################
# DO NOT EDIT FOLLOWING
 
COMPILED_UI = $(UI_FILES:%.ui=$(COMPILED_DIR)/ui_%.py)
COMPILED_RESOURCES = $(RESOURCES:%.qrc=$(COMPILED_DIR)/%_rc.py)
 
all : resources ui 
 
resources : $(COMPILED_RESOURCES) 
 
ui : $(COMPILED_UI)
 
$(COMPILED_DIR)/ui_%.py : $(RESOURCE_DIR)/%.ui
	$(PYUIC) $< -o $@
 
$(COMPILED_DIR)/%_rc.py : $(RESOURCE_DIR)/%.qrc
	$(PYRCC) $< -o $@
 
clean : 
	$(RM) $(COMPILED_UI) $(COMPILED_RESOURCES) $(COMPILED_UI:.py=.pyc) $(COMPILED_RESOURCES:.py=.pyc)  

Funguje s GNU Make (na Windows například v Cygwinu nebo MinGW). Je potřeba poeditovat horní řádky souboru, především upravit cesty k souborům a jejich seznam. Skript překládá soubory následovně (příklad):

  • okno.ui –> ui_okno.py (definice GUI)
  • obrazky.qrc –> obrazky_rc.py (resources)

Teď se kompilují už jen ty změněné, stačí napsat make do konzole. Samozřejmě v pracovním adresáři shodným s umístěním Makefile souboru.