RkBlog

Hardware, programming and astronomy tutorials and reviews.

Wprowadzenie do PyQt3

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

Interfejsy Graficzne, 14 July 2008, Piotr Maliński

Comment article