RkBlog

Hardware, programming and astronomy tutorials and reviews.

Zdarzenia w PyQt

Obsługa zdarzeń (events) w PyQt4 na przykładzie QListWidget i zdarzeń myszy.

PyQt oprócz sygnałów i slotów wykorzystuje mechanizm zdarzeń (events) do "informowania" o akcjach jakie zachodzą w aplikacji. Przykładowo widżet listy "QListWidget" posiada sygnał "itemClicked" informujący o kliknięciu w dany element, lecz zostanie on wysłany dla kliknięcia dowolnym przyciskiem myszy. Dla dokładniejszej kontroli tego typu widżetów stosuje się zdarzenia, które dają także informacje o typie zdarzenia. Przykładowo wykorzystamy:
mouseReleaseEvent (self, QMouseEvent e)
mousePressEvent (self, QMouseEvent e)
By móc oprogramować zdarzenie należy stworzyć własną klasę dziedziczącą interesujący nas widżet. Nasza klasa musi zawierać metody o nazwach odpowiadających nazwie zdarzenia (np. te dwa powyżej). Argumentem tych metod będzie obiekt odpowiedniego zdarzenia (dla powyższych dwóch zdarzeń będzie to QMouseEvent). Oto działający przykład prezentujący działanie zdarzeń:
# -*- coding: utf-8 -*-
import sys

from PyQt4 import QtCore, QtGui

class FileManagerWidget(QtGui.QListWidget):
	def __init__(self, parent=None):
		"""
		QListWidget with handling of mouse events - left and right clicks
		"""
		super(FileManagerWidget, self).__init__(parent)
		
		# configure the items list
		self.setViewMode(QtGui.QListView.IconMode)
		self.setLayoutMode(QtGui.QListView.SinglePass)
		self.setResizeMode(QtGui.QListView.Adjust)
		self.setGridSize(QtCore.QSize(75, 75))
	
	def mouseReleaseEvent(self, event):
		"""
		mouse button release event
		"""
		button = event.button()
		# select an item on which we clicked
		item = self.itemAt(event.x(), event.y())
		if item:
			self.setCurrentItem(item)
			if button == 1:
				print 'SIMPLE LEFT CLICK'
	
	def mousePressEvent(self, event):
		"""
		mouse clicks events
		"""
		button = event.button()
		item = self.itemAt(event.x(), event.y())
		if item:
			# select the item we clicked
			self.setCurrentItem(item)
			if button == 1:
				print 'LEFT CLICK - DRAG'
		if button == 2:
			print 'RIGHT CLICK'

app = QtGui.QApplication(sys.argv)

f = FileManagerWidget()
for i in range(1,20):
	f.addItem(unicode(i))
f.show()

sys.exit(app.exec_())
Stworzyliśmy własną klasę dziedziczącą "QListWidget" i zdefiniowaliśmy dwie metody obsługujące interesujące nas zdarzenia. QMouseEvent ukryty pod argumentem event zawiera takie metody jak "x()" i "y()" zawierające współrzędne zdarzenia - kliknięcia, czy też uwolnienia przycisku myszy. Metoda button() informuje który przycisk spowodował zdarzenie. Oprócz samych zdarzeń zaznaczamy element, który został kliknięty korzystając z jakże poręcznej metody itemAt(X, Y), która zwraca element listy znajdujący się w podanych współrzędnych (jeżeli jest). Zapisz plik i uruchom z konsoli. Klikaj na elementy w różny sposób, a w konsoli zobaczysz stosowne komunikaty. Oprócz zdarzeń dotyczących akcji jakie mają miejsce w danym widżecie zaimplementowano kilka innych "typów" - np. zdarzenia zachodzące w określonym czasie (QTimerEvent).
RkBlog

8 December 2008;

Comment article