Maison  >  Article  >  développement back-end  >  Événements et signaux que vous devez apprendre chaque jour dans PyQt5

Événements et signaux que vous devez apprendre chaque jour dans PyQt5

不言
不言original
2018-04-20 13:59:453234parcourir

Cet article présente principalement en détail les informations pertinentes sur les événements et les signaux qui doivent être appris chaque jour dans PyQt5. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Nous explorerons cette partie Comment PyQt5. les événements et les signaux sont implémentés dans les applications.

Événements

Toutes les applications GUI sont pilotées par des événements. Les événements d'application sont principalement générés par l'utilisateur, mais ils peuvent également être générés par d'autres méthodes, telles qu'une connexion Internet, un gestionnaire de fenêtres ou un minuteur. Lorsque nous appelons la méthode exec_() de l’application, l’application entre dans la boucle principale. La boucle principale détecte divers événements et les envoie aux objets événement.

Dans le modèle d'événement, il y a trois participants :

  • source d'événement (source d'événement)

  • objet d'événement (source d'événement) Objet)

  • cible de l'événement (cible de l'événement)

La source de l'événement est le changement d'état de l'objet qui génère les événements. Un objet événement (événement) est un objet qui encapsule les changements d'état dans une source d'événement. La cible de l'événement est l'objet qui souhaite être notifié. L'objet source d'événement représente la tâche de gestion d'un événement vers la cible de l'événement.

PyQt5 utilise un mécanisme de signal et de slot unique pour gérer les événements. Les signaux et les emplacements sont utilisés pour la communication entre les objets. Lorsqu'un événement spécifique se produit, un signal est émis. Le slot peut être n’importe quel appel Python. Le signal est émis lorsque le slot qui y est connecté est appelé.

Signaux et slotsSignaux et slots

Ceci est un exemple simple démontrant les signaux et les slots de PyQt5.


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

这个例子中,我们将QSlider的滑动信号连接到QLCDNumber中。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QSlider, 
QLCDNumber, QVBoxLayout)
from PyQt5.QtCore import Qt

class Example(QWidget):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 lcd = QLCDNumber(self)
 sld = QSlider(Qt.Horizontal, self)

 vbox = QVBoxLayout()
 vbox.addWidget(lcd)
 vbox.addWidget(sld)

 self.setLayout(vbox)
 sld.valueChanged.connect(lcd.display)

 self.setGeometry(300, 300, 250, 150)
 self.setWindowTitle('信号/槽') 
 self.show()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())


Dans notre exemple, QtGui.QLCDNumber et QtGui.QSlider seront utilisés. Nous modifions les numéros LCD en faisant glisser le curseur.


sld.valueChanged.connect(lcd.display)


Ici, le signal valueChanged du curseur est connecté à la fente d'affichage de l'écran LCD.

Un émetteur est un objet qui envoie des signaux. Un récepteur est un objet qui reçoit un signal. Le slot est la méthode de retour au signal.

Une fois le programme exécuté

Événements et signaux que vous devez apprendre chaque jour dans PyQt5

Remplacer le gestionnaire d'événements système

Les événements sont souvent traités dans PyQt5 par Remplacez le gestionnaire d'événements.


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们执行事件处理程序。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt

class Example(QWidget):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 self.setGeometry(300, 300, 250, 150)
 self.setWindowTitle('事件处理') 
 self.show()

 def keyPressEvent(self, e):
 if e.key() == Qt.Key_Escape:
  self.close()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())


Dans notre cas, nous réimplémentons le gestionnaire d'événements keyPressEvent().


def keyPressEvent(self, e):
 if e.key() == Qt.Key_Escape:
 self.close()


Si nous appuyons sur la touche Échap du clavier, l'application se termine.

Envoi d'événement de l'expéditeur d'événement

Afin de distinguer facilement plusieurs sources d'événements connectées à la même cible d'événement, la méthode sender() peut être utilisée dans PyQt5.


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们确定事件发送对象。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class Example(QMainWindow):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 btn1 = QPushButton('按钮一', self)
 btn1.move(30, 50)

 btn2 = QPushButton('按钮二', self)
 btn2.move(150, 50)

 btn1.clicked.connect(self.buttonClicked)
 btn2.clicked.connect(self.buttonClicked)

 self.statusBar()

 self.setGeometry(300, 300, 300, 150)
 self.setWindowTitle('事件发送') 
 self.show()

 def buttonClicked(self):

 sender = self.sender()
 self.statusBar().showMessage(sender.text() + ' 被按下')

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())


Dans notre cas il y a deux boutons. Les deux boutons sont connectés à la méthode buttonClicked() et nous répondons au bouton cliqué en appelant la méthode sender().


btn1.clicked.connect(self.buttonClicked)
btn2.clicked.connect(self.buttonClicked)


Deux boutons sont connectés au même emplacement.


def buttonClicked(self):

 sender = self.sender()
 self.statusBar().showMessage(sender.text() + ' 被按下')


Nous déterminons la source du signal en appelant la méthode sender(). Dans la barre d'état de l'application, affiche le libellé du bouton enfoncé.

Après l'exécution du programme

Événements et signaux que vous devez apprendre chaque jour dans PyQt5

Émission personnalisée de signaux

Les objets créés à partir d'un QObject peuvent émettre des signaux . Dans l'exemple ci-dessous, nous verrons comment personnaliser le signal émis.


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们显示了如何以发射信号。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import pyqtSignal, QObject

class Communicate(QObject):
 closeApp = pyqtSignal()

class Example(QMainWindow):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 self.c = Communicate()
 self.c.closeApp.connect(self.close)

 self.setGeometry(300, 300, 300, 150)
 self.setWindowTitle('发射信号') 
 self.show()

 def mousePressEvent(self, event):

 self.c.closeApp.emit()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())


Nous créons un nouveau signal appelé closeApp. Ce signal émet un événement de pression de souris. Ce signal est connecté au slot close() dans QMainWindow.


class Communicate(QObject):
 closeApp = pyqtSignal()


Créez une classe Communicate héritée de QObject, qui possède une propriété de la classe pyqtSignal().


self.c = Communicate()
self.c.closeApp.connect(self.close)


Connectez notre signal closeApp personnalisé à l'emplacement close() dans QMainWindow.


def mousePressEvent(self, event):
 self.c.closeApp.emit()


Lorsque notre souris clique sur la fenêtre du programme, le signal closeApp est émis (emit). Application terminée.

Recommandations associées :

Python PyQt4 implémente l'effet de tiroir QQ

PyQt implémente l'effet de commutation d'interface


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn