RkBlog

Hardware, programming and astronomy tutorials and reviews.

PyQT bez QTDesignera

Opis podstawowych modułów i komponentów biblioteki PyQt3 zawierający proste klasy uruchamiające aplikacji z programowo stworzonym interfejsem graficznym

QTDesigner dobry jest przy rysowaniu widgetów lecz edytor tekstowy ma tragiczny. Również w przypadku złożonych projektów narzędzie to nie jest zbyt przyjazny. Niniejszy tutorial opisuje programowanie z PyQT bez uwzględniania QtDesignera.
Oto prosty przykład
import sys
from qt import *

#tworzymy obiekt QAplication
app=QApplication(sys.argv)
#tworzymy widget typu QPushButton
button=QPushButton("Hello World", None)
#przypisujemy przycisk jako główny widget
app.setMainWidget(button)
#wyświetlamy wszystko
button.show()
app.exec_loop()
Kod z tego przykładu wyświetli prosty przycisk, QPushButton. Zaprezentowany przykład obowiązuje dla wszystkich aplikacji - tworzymy obiekt QApliaction, przypisujemy główny widget i wszystko wyświetlamy.

Oto nieco bardziej rozbudowany przykład:
import sys
from qt import *

#tworzymy klasę dziedziczącą QmainWindow
class HelloWindow(QMainWindow):
    def __init__(self, *args):
	apply(QMainWindow.__init__, (self,) + args)
	#tworzymy przycisk
	self.button= QPushButton("Hello World", self)
	#i przypisujemy jako główny widget
	self.setCentralWidget(self.button)

def main(args):
	app=QApplication(args)
	win=HelloWindow()
	win.show()
	#przypisanie sygnału lastWindowClosed() do slotu quit()
	app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
	app.exec_loop()

if __name__=="__main__":
	main(sys.argv)
W tym przykładzie tworzymy klasę dziedziczącą po QMainWindow - widgecie głównym oknie, w którym możemy umieszczać inne widgety, np. za pomocą metody setCentralWidget. Kolejną nowością są sygnały i sloty. QT zawiera zestaw własnych sygnałów - np. kliknięto na przycisk oraz slotów - akcji, np. zakończ program. Można tworzyć własne sloty jak również tworzyć własne sygnały, o czym później. Teraz przykład definiowania własnego sygnału:
# -*- coding: utf-8 -*-
import sys
from qt import *

# subklasujemy QDialog
class Form1(QDialog):
    def __init__(self,parent = None,name = None,modal = 0,fl = 0):
	QDialog.__init__(self,parent,name,modal,fl)
	#tworzymy przycisk
	self.pushButton1 = QPushButton(self)
	self.pushButton1.setText("Kliknij mnie!")
	#łączymy slot z własnym sygnałem
	self.connect(self.pushButton1,SIGNAL("clicked()"),self.sygnal)
	
    #definiujemy własny sygnał
    def sygnal(self):
	print "wcisniety przycisk"

def main(args):
         app=QApplication(args)
         win=Form1()
         app.setMainWidget(win)
         win.show()
         app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
         app.exec_loop()

if __name__=="__main__":
         main(sys.argv)
Wciskanie przycisku spowoduje wyświetlanie w konsoli tekstu "wcisniety przycisk".

Rozmiar widgetów, wiele widgetów w jednym oknie

Oto trochę zmodyfikowany ostatni przykład:
# -*- coding: utf-8 -*-
import sys
from qt import *

# subklasujemy QDialog
class Form1(QDialog):
    def __init__(self,parent = None,name = None,modal = 0,fl = 0):
	QDialog.__init__(self,parent,name,modal,fl)
	#tworzymy przycisk
	self.pushButton1 = QPushButton(self)
	self.pushButton1.setText("Kliknij mnie!")
	self.pushButton1.setGeometry(QRect(10,10,200,80))
	self.pushButton2 = QPushButton(self)
	self.pushButton2.setText("Bla Bla Bla")
	self.pushButton2.setGeometry(QRect(10,100,100,80))
	#łączymy slot z własnym sygnałem
	self.connect(self.pushButton1,SIGNAL("clicked()"),self.sygnal)
	
    #definiujemy własny sygnał
    def sygnal(self):
	print "wcisniety przycisk"

def main(args):
         app=QApplication(args)
         win=Form1()
         app.setMainWidget(win)
         win.show()
         app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
         app.exec_loop()

if __name__=="__main__":
         main(sys.argv)
self.identyfikator_widgeta.setGeometry(QRect(x,y,długość,wysokość)) - gdzie x to odległość od lewego boku, y - odległość od góry; określa rozmiar widgeta. W powyższym przykładzie mamy 2 przyciski obok siebie. Tworząc interfejs można sobie narysować widgety w designerze a potem za pomocą pyuic wygenerować plik *py i wyciągnąć z niego namiary widgetów :) Reszta programowania przebiega tak samo jak opisano w poprzednich artykułach. Wystarczy wziąć powyższy przykład jako szablon i do dzieła :)
RkBlog

Interfejsy Graficzne, 14 July 2008,

Comment article