RkBlog

Hardware, programming and astronomy tutorials and reviews.

Wprowadzenie do PyQt3

Opis podstaw biblioteki PyQt4 udostępniającej API biblioteki Qt3 w Pythonie, opis mechanizmu sygnałów i slotów oraz tworzenia interfejsów GUI

PyQt3 to biblioteka pythona dla biblioteki QT Trolltechu. Na QT oparte jest KDE oraz spora liczba niezależnych aplikacji (qtparted, dc-qt, qtella i inne). Zaletą pyQT czy też samego QT jest QTdesigner - narzędzie do rysowania graficznych interfejsów jak i kodowania całej aplikacji. QT to C++ i pisanie aplikacji w czystym QT łatwe raczej nie jest, natomiast pyQT zmienia poziom trudności na bardzo łatwy.
Stworzymy teraz prostą aplikację wyświetlającą dane o procesorze (z /proc/cpuinfo). Pierwszy etap to pobranie dokumentacji (np. za pomocą httrack) widgetów QT ze strony trolltechu. Potrzebujemy wszystko z "all widgets"
pyqt1
Następny etap to instalacja pyQT. W każdej dystrybucji pakiet ten powinien być dostępny, czasami może być połączony z pyKDE. Gdy już mamy pyQT to uruchamiamy QT Designera (powinien być z QT, ew. QT-devel, nazwa: "designer") Pojawi się okno startowe:
pyqt2
Wybieramy "Dialog". Pojawi się puste okno bez widgetów:
pyqt3
Z menu po lewej wybieramy typ widgetu, który chcemy narysować w oknie. Zaznaczamy "Push Button" i rysujemy 2 widgety tego typu. Z zakładki "Display" rysujemy jeden "TextBrowser" by otrzymać:
pyqt4
Kliknij dwa razy na dany przycisk (Push Button) by edytować jego tekst (Caption) Wpisz dla jednego "Wyjdź" dla drugiego "Wczytaj". Zaznacz całe okno i w menu po prawej opisującym widget znajdź pole "Caption" i wpisz "Centrum Informacyjne Procesora"
pyqt6
W efekcie powinniśmy otrzymać:
pyqt5

Sygnały i Sloty

By nasz widget działał wszystkie elementy muszą wysyłać jakieś sygnały, które muszą wywoływać zdarzenia. Widgety potrafią wysyłać sygnały jak "kliknięty" lecz zdarzenia to już nasza kwestia. Zaznacz z poziomej belki ikonę "Connect Singal and Slots" (z czerwoną strzałką)
pyqt7
Następnie wciśnij przycisk myszy nad Przyciskiem "wyjdź" i wciśnięty przeciągnij nad formularz tak by cały został podświetlony na różowo. Puść przycisk - właśnie stworzyłeś połączenie sygnał-zdarzenie.
pyqt8
Pojawi się okno zarządzające sygnałami-zdarzeniami. Przycisk "Wyjdź" ma zamykać aplikację. Zdarzenie "zamknij aplikację" jest dostępne w QT jako slot "close()". Po ustawienia wpisu nasz pierwszy przycisk będzie działał (w gotowej aplikacji). Drugi przycisk będzie miał za zadanie wykonanie zdarzenia niedostępnego w QT. Z menu "Edit" wybierz "Slots" i dodaj nową funkcję i ustaw jej nazwę na "czytaj", reszty zmieniać nie trzeba. Następnie tworzymy nowy sygnał-zdarzenie od przycisku "Wczytaj" do formularza (podobnie jak w pierwszym przypadku) gdzie jako zdarzenie (slot) wybieramy naszą funkcję:
pyqt11
Teraz musimy napisać kod dla naszej funkcji. Kliknij dwa razy na formularz i wyraź zgodę na stworzenie "form1.ui.h". Pojawi się edytor tekstowy, w którym będziemy mogli wpisać kod - kod pythona a nie c++ :) Kod wygląda następująco
void Form1::czytaj()
{
plik = open('/proc/cpuinfo')
try:
        tekst = plik.read()
finally:
        plik.close()
self.textBrowser1.setText(tekst)
}
Początek to wczytanie pliku, przedostatni wiersz - self.textBrowser1.setText(tekst) to już pyQT. Nasz widget TextBrowser ma nazwę (label) domyślną "textBrowser1"
pyqt12
setText(napis) to metoda tego widgeta, opisana w dokumentacji QT - metody tam opisane przekładają się bezpośrednio na te w PyQT. Podsumowując po wciśnięciu przycisku "Wczytaj" wykona się podany kod. Zapisujemy naszą aplikację jako form1. Teraz z konsoli przetwarzamy kod QTDesignera na Pythona:
pyuic form1.ui > form1.py
W tym samym katalogu tworzymy plik start.py o kodzie:
from qt import *
from form1 import *
import sys
if __name__ == "__main__":
     app = QApplication(sys.argv)
     f = Form1()
     f.show()
     app.setMainWidget(f)
     app.exec_loop()
Jest to "standardowy" kod startujący aplikacje napisane w PyQT, przynajmniej te proste. Uruchamiamy start.py. Efekt:
pyqt13
RkBlog

14 July 2008;

Comment article