Manejo de eventos predeterminado de PyQt5

1. Introducción
Las aplicaciones basadas en widgets son impulsadas por eventos. Al hacer clic con el mouse, presionar un botón, volver a dibujar un componente y minimizar la ventana, se generarán los eventos correspondientes. Estos eventos se tratan en consecuencia para realizar las funciones del programa.

2. El bucle de eventos del programa de aplicación
El evento es generado principalmente por el sistema de ventanas del sistema operativo, y el evento generado ingresa a una cola de eventos y es procesado por el bucle de eventos del programa de aplicación. La siguiente es la estructura principal del programa de una aplicación PyQt5:

app = QApplication(sys.argv)
mainform = QmyWidget()
mainform.show()
sys.exit(app.exec_())

app es el objeto de aplicación creado y el último app.exec_() ejecutado inicia el ciclo de procesamiento de eventos de la aplicación . La aplicación procesará los eventos en cola en la cola de eventos y también puede realizar un procesamiento combinado en los mismos eventos. Por ejemplo, el evento de rediseño paintEvent de un componente de la interfaz, si el mismo evento aparece repetidamente en la cola de eventos, la aplicación lo fusionará y procesará, por lo que el procesamiento de eventos es un mecanismo de procesamiento asincrónico .

3. Tipos de eventos y funciones de procesamiento de eventos predeterminadas
En PyQt5, un evento es un objeto representado por la clase abstracta QEvent . Hay muchas subclases de QEvent que representan eventos específicos, como QKeyEvent para eventos clave, QMouseEvent para eventos de mouse y QPaintEvent para eventos de dibujo de ventanas.

Cuando ocurre un evento, PyQt5 creará un objeto de instancia de evento con la subclase correspondiente de QEvent según el tipo específico de evento, y luego lo pasará a la función event() del objeto que generó el evento para su procesamiento.

Tanto la clase QObject como sus subclases pueden manejar eventos, pero el procesamiento de eventos se usa principalmente en la clase de formulario ( QWidget y sus subclases). El siguiente es el prototipo de la función event() de la clase QObject:

event(self, <em>e</em>)

El parámetro e es el tipo de QEvent, y la clase QEvent tiene principalmente las siguientes tres funciones de interfaz:
(1) aceptar () : indica que el receptor de eventos acepta el evento y lo procesa, y el evento aceptado no se propagará a el componente del contenedor superior.
(2) ignorar () : indica que el receptor de eventos ignora el evento secundario y el evento ignorado se propagará al componente del contenedor superior.
(3) tipo() : El tipo de evento devuelto es el tipo de enumeración QEvent.Type. Este tipo de enumeración consta de más de 100 valores, que representan más de 100 tipos de eventos.

Cada valor del tipo de enumeración QEvent.Type corresponde a una clase de evento. Por ejemplo, el tipo QEvent.KeyPress representa un evento de pulsación de tecla y la clase de evento correspondiente es QKeyEvent.

Después de que una clase recibe un evento, primero activará su función event(). Si la función event() no realiza ningún procesamiento, activará automáticamente el controlador de eventos predeterminado.

La clase QWidget es la clase principal de todas las clases de componentes de la interfaz y define los controladores predeterminados para varios eventos. Por ejemplo, el tipo de enumeración del evento de doble clic del mouse es QEvent.MouseButtonDblClick y el controlador de eventos predeterminado es mouseDoubleClickEvent(). El prototipo de función es:

mouseDoubleClickEvent(self, event)

El evento del parámetro es de tipo QMouseEvent, que es la clase correspondiente al tipo de mouse.
QWidget define muchas funciones de procesamiento de eventos predeterminadas, que pasarán un parámetro de evento, pero el tipo de evento está determinado por el tipo de evento específico. Las funciones de procesamiento de eventos predeterminadas comúnmente utilizadas se muestran en la tabla (solo el nombre de la función aparece en la tabla y los parámetros de entrada de la función no se enumeran)

nombre de función predeterminado sincronización del gatillo Tipo de evento de parámetro
eventoPressEvent() Se activa cuando se presiona un botón del mouse QMouseEvent
eventoReleaseEvent() Se dispara cuando se suelta el botón del mouse. QMouseEvent
mouseMoveEvent() Se activa cuando se mueve el mouse. QMouseEvent
ratónDoubleClickEvent() Se activa cuando se hace doble clic con el mouse QMouseEvent
evento de pulsación de tecla() Se activa cuando se presiona una tecla del teclado QKeyEvent
evento de liberación de clave() Se activa cuando se suelta una tecla del teclado QKeyEvent
pintarEvento() Se activa cuando es necesario volver a pintar la interfaz. QPaintEvento
cerrarEvento() Se activa cuando se cierra un formulario. QCerrarEvento
mostrarEvento() Se activa cuando se muestra una ventana. QShowEvent
ocultarEvento() Se activa cuando un formulario está oculto QOcultarEvento
cambiar tamañoEvento() Se activa cuando el componente cambia de tamaño, como cuando una ventana cambia de tamaño. QResizeEvent
enfoque en evento() Se activa cuando un componente obtiene el foco del teclado, como un componente QLineEdit obtiene el foco de entrada Evento QFocus
enfoqueOutEvent() Se activa cuando un componente pierde el foco del teclado, como un componente QLineEdit pierde el foco de entrada Evento QFocus
entrarEvento() Se activa cuando el mouse ingresa al espacio de la pantalla del componente, como cuando el mouse se mueve sobre un componente QPushButton QEvento
dejarEvento() Se activa cuando el mouse abandona el espacio de la pantalla del componente, como un componente QPushButton QEvento
arrastrarEnterEvent() La operación de arrastre está en curso y se activa cuando el mouse se mueve sobre el componente. QDragEnterEvento
arrastrarLeaveEvent() Hay una operación de arrastre en curso, que se activa cuando el mouse sale del componente QDragLeaveEvent
arrastrarMoveEvent() Se activa cuando la operación de arrastre está en curso y el mouse se mueve Evento QDragMove
soltarEvento() Se activa cuando se suelta una operación de arrastre sobre un componente QDropEvento

Los usuarios pueden volver a implementar estas funciones de manejo de eventos predeterminadas en clases personalizadas heredadas de QWidget o sus subclases, para lograr algunas funciones requeridas. Por ejemplo, QWidget no tiene una señal de clic (), por lo que el clic del mouse no se puede procesar a través de señales y ranuras, pero la función mouseReleaseEvent () se puede volver a implementar para procesar el evento de clic del mouse.

El siguiente ejemplo ilustra el manejo de eventos predeterminado basado en la plantilla de proyecto widgetApp:
inserte la descripción de la imagen aquí

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox
from PyQt5.QtCore import pyqtSlot, Qt, QEvent
from PyQt5.QtGui import QPainter, QPixmap

from ui_Widget import Ui_Widget
class QmyWidgrt(QWidget):
	def __init__(self, parent = None):
		super().__init__(parent)	#调用父类构造函数,创建窗体
		self.ui = Ui_Widget()		#创建UI对象
		self.ui.SetupUi(self)		#构造UI

Luego, en la clase QmyWidget, se vuelven a implementar las siguientes funciones de procesamiento predeterminadas de algunos eventos típicos.
(1) paintEvent ()
se activa cuando es necesario volver a dibujar la interfaz y se pueden implementar algunas funciones de dibujo personalizadas en esta función de evento. Dibuja la imagen de fondo del formulario:

def paintEvent(self, event):
	painter = QPainter(self)
	pic = QPixmap("sea1.jpg")
	painter.drawPixmap(0, 0, self.width(), self.height(), pic)
	super().paintEvent(event)

La función de la función es dibujar un archivo de imagen sea1.jpg en toda el área del formulario, y el pintor de objetos de pincel del formulario se utiliza para dibujar. El archivo de imagen sea1.jpg debe estar en el mismo directorio que el archivo de script que lo utiliza. La última línea de la declaración significa ejecutar la función de procesamiento de eventos paintEvent () de la clase principal, para que la clase principal pueda realizar algunas operaciones integradas.

(2) resizeEvent()
se activa cuando la ventana cambia de tamaño. En esta función de evento, siempre se coloca un botón btnTest en el centro de la ventana de acuerdo con el tamaño de la ventana.

def resizeEvent(self, event):
	W = self.width()
	H = self.height()
	Wbtn = self.ui.btnTest.width()
	Hbtn = self.ui.btnTest.height()
	self.ui.btnTest.setGeometry((W-Wbtn)/2, (H-Hbtn)/2, Wbtn, Hbtn)

(3) closeEvent()
se activa cuando se cierra el formulario. En esta función de evento, se puede usar un cuadro de diálogo para preguntar si se debe cerrar el formulario. El código es el siguiente:

def closeEvent(self, event):
	dlgTitle = "Question消息框"
	strInfo = "closeEvent事件触发,确定要退出吗?"
	defaultBtn = QMessageBox.NoButton
	result = QMessageBox.question(self, dlgTitle, strInfo, QMessageBox.Yes | QMessageBox.No, defaultBtn)
	if(result == QMessageBox.Yes):
		event.accept()			#窗体可关闭
	else:
		event.ignore()			#窗体不可关闭

El cuadro de diálogo QMessageBox se utiliza para preguntar si se desea cerrar el formulario.
inserte la descripción de la imagen aquí
El evento de parámetro de la función closeEvent (evento) es de tipo QCloseEvent, y la función aceptar () de QCloseEvent se puede llamar de acuerdo con el resultado de retorno del cuadro de diálogo para cerrar el formulario, mientras que la función ignorar () no cierra el forma.

(4) mousePressEvent ()
se activa cuando se presiona el botón del mouse. En esta función de evento, se juzga si se presiona el botón izquierdo del mouse. Si se presiona el botón izquierdo, se muestran las coordenadas de pantalla del cursor del mouse, a saber:

def mousePressEvent(self, event):
	pt = event.pos()		#鼠标位置,QPoint
	if(event.button() == Qt.LeftButton):	#鼠标左键按下
		self.ui.LabMove.setText("(x, y) = (%d, %d)" %(pt.x(), pt.y()))
		rect = self.ui.LabMove.geometry()
		self.ui.LabMove.setGeometry(pt.x(), pt.y(), rect.width(), rect.height())
	super().mousePressEvent(event)

El evento de parámetro es del tipo QMouseEvent, y QMouseEvent tiene las siguientes funciones de interfaz, que representan la información del botón presionado y la información de coordenadas del mouse.

  • Función button(): el valor de retorno es el tipo de enumeración Qt.MouseButton, que indica qué botón del mouse se presiona y tiene múltiples valores como Qt.NoButton, Qt.LeftButton, Qt.RightButton y Qt.MidButton.
  • Función de botones (): el valor de retorno es una combinación de valores del tipo de enumeración Qt.MouseButton, que se puede usar para juzgar cuándo se presionan varios botones, por ejemplo, la declaración para juzgar cuándo se presionan los botones izquierdo y derecho del mouse. al mismo tiempo es:
if(event.buttons() & Qt.LeftButton) and (event.buttons() & Qt.RightButton):
  • Función x() y función y(): el valor de retorno es de tipo int; función pos(), el valor de retorno es de tipo QPoint. Los valores de retorno de estos dos grupos de funciones representan las coordenadas relativas del cursor del mouse en el componente (widget) que recibe este evento.
  • Función localPos(): El valor de retorno es de tipo QPointF, que indica las coordenadas relativas del cursor del mouse en el componente (widget) o elemento (elemento) que recibe este evento.
  • Función windowPos (): el valor de retorno es de tipo QPointF, que indica las coordenadas relativas del cursor del mouse en la ventana (ventana) que recibe este evento.
  • Función globalX() y función globalY(): el valor de retorno es de tipo int; función globalPos(), el valor de retorno es de tipo QPoint. Los valores de retorno de estos dos grupos de funciones representan las coordenadas globales del cursor del mouse, es decir, las coordenadas en la pantalla.
  • Función screenPos(): El valor de retorno es de tipo QPointF, indica las coordenadas globales del cursor del mouse en la pantalla que recibe este evento.

(5) keyPressEvent() o keyReleaseEvent()
keyPressEvent() se activa cuando se presiona una tecla en el teclado, y keyReleaseEvent() se activa cuando se suelta la tecla. El código escrito para keyPressEvent() es el siguiente:

def keyPressEvent(self, event):
	rect = self.ui.btnMove.geometry()
	if event.key() in set([Qt.Key_A, Qt.Key_Left]):
		self.ui.btnMove.setGeometry(rect.left() - 20, rect.top(), rect.width(), rect.height())
	elif event.key() in set([Qt.Key_D, Qt.Key_Right]):
		self.ui.btnMove.setGeometry(rect.left() + 20, rect.top(), rect.width(), rect.height())
	elif event.key() in set([Qt.Key_W, Qt.Key_Up]):
		self.ui.btnMove.setGeometry(rect.left, rect.top() - 20, rect.width(), rect.height())
	elif event.key() in set([Qt.Key_S, Qt.Key_Down]):
		self.ui.btnMove.setGeometry(rect.left, rect.top() + 20, rect.width(), rect.height())

El evento de parámetro de la función keyPressEvent (evento) es del tipo QKeyEvent, que tiene las siguientes dos funciones de interfaz principales, que representan la información de la tecla presionada.

  • Función key(): el tipo de valor de retorno es int, que indica la tecla presionada, que corresponde al valor del tipo de enumeración Qt.Key. El tipo de enumeración Qt.Key incluye valores de enumeración de todas las teclas del teclado, como Qt.Key_Escape, Qt.Key_Tab, Qt.Key_Delete, Qt.Key_Alt, Qt.Key_F1, Qt.Key_A, etc. (consulte la ayuda de Qt documentación para más detalles).
  • Función modificadores (): el valor de retorno es la combinación de valores del tipo de enumeración Qt.KeyboardModifier, que representa algunas teclas utilizadas para combinación, como Ctrl, Alt, Shift y otras teclas. Por ejemplo, la instrucción para determinar si se presiona Ctrl+Q es la siguiente:
if(event.key() == Qt.Key_Q) and (event.modifiers() & Qt.ControlModifier):

Este programa espera que cuando se presionan W, A, S, D o las teclas de flecha arriba, abajo, izquierda y derecha, el botón btnMove en el formulario pueda moverse hacia arriba, abajo, izquierda y derecha. Pero encontrará que cuando usa la función de evento keyPressEvent(), solo W, A, S y D son válidos, y si usa la función keyReleaseEvent(), entonces W, A, S, D y arriba, abajo, izquierda y las teclas de direcciones correctas son válidas. Esto significa que no se generará ningún evento QEvent.KeyPress cuando se presionen las teclas de flecha arriba, abajo, izquierda y derecha.

Supongo que te gusta

Origin blog.csdn.net/qq_35412059/article/details/127405181
Recomendado
Clasificación