Heim  >  Artikel  >  Backend-Entwicklung  >  Ereignisse und Signale, die Sie jeden Tag in PyQt5 lernen müssen

Ereignisse und Signale, die Sie jeden Tag in PyQt5 lernen müssen

不言
不言Original
2018-04-20 13:59:453174Durchsuche

Dieser Artikel stellt hauptsächlich die relevanten Informationen zu Ereignissen und Signalen vor, die jeden Tag in PyQt5 gelernt werden müssen. Er hat einen bestimmten Referenzwert.

Wir werden diesen Teil erkunden Wie PyQt5 Ereignisse und Signale werden in Anwendungen implementiert.

Ereignisse

Alle GUI-Anwendungen sind ereignisgesteuert. Anwendungsereignisse werden in erster Linie vom Benutzer generiert, können aber auch durch andere Methoden generiert werden, beispielsweise durch eine Internetverbindung, einen Fenstermanager oder einen Timer. Wenn wir die Methode exec_() der Anwendung aufrufen, tritt die Anwendung in die Hauptschleife ein. Die Hauptschleife erkennt verschiedene Ereignisse und sendet sie an Ereignisobjekte.

Im Ereignismodell gibt es drei Teilnehmer:

  • Ereignisquelle (Ereignisquelle)

  • Ereignisobjekt (Ereignis). Objekt)

  • Ereignisziel (Ereignisziel)

Die Ereignisquelle ist die Zustandsänderung des Objekts, das Ereignisse generiert. Ein Ereignisobjekt (Ereignis) ist ein Objekt, das Zustandsänderungen in einer Ereignisquelle kapselt. Das Ereignisziel ist das Objekt, das benachrichtigt werden möchte. Das Ereignisquellenobjekt stellt die Aufgabe dar, ein Ereignis zum Ereignisziel zu verarbeiten.

PyQt5 verwendet einen einzigartigen Signal- und Slot-Mechanismus zur Verarbeitung von Ereignissen. Signale und Slots dienen der Kommunikation zwischen Objekten. Beim Eintreten eines bestimmten Ereignisses wird ein Signal ausgesendet. Der Slot kann ein beliebiger Python-Aufruf sein. Das Signal wird beim Aufruf des angeschlossenen Slots ausgegeben.

Signale und SlotsSignale und Slots

Dies ist ein einfaches Beispiel, das die Signale und Slots von PyQt5 demonstriert.


#!/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_())


In unserem Beispiel werden QtGui.QLCDNumber und QtGui.QSlider verwendet. Wir ändern die LCD-Nummern, indem wir den Schieberegler ziehen.


sld.valueChanged.connect(lcd.display)


Hier wird das valueChanged-Signal des Schiebereglers mit dem Display-Slot des LCD verbunden.

Ein Sender ist ein Objekt, das Signale sendet. Ein Empfänger ist ein Objekt, das ein Signal empfängt. Der Schlitz ist die Methode der Rückmeldung zum Signal.

Nachdem das Programm ausgeführt wurde

Ereignisse und Signale, die Sie jeden Tag in PyQt5 lernen müssen

Überschreiben Sie den Systemereignishandler

Ereignisse werden in PyQt5 häufig von verarbeitet Event-Handler überschreiben.


#!/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_())


In unserem Fall implementieren wir den Ereignishandler keyPressEvent() erneut.


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


Wenn wir die Esc-Taste auf der Tastatur drücken, wird die Anwendung beendet.

Ereignissender-Ereignissenden

Um mehrere Ereignisquellen, die mit demselben Ereignisziel verbunden sind, leicht zu unterscheiden, kann in PyQt5 die Methode sender() verwendet werden.


#!/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_())


In unserem Fall gibt es zwei Knöpfe. Beide Schaltflächen sind mit der Methode buttonClicked() verbunden und wir reagieren auf die angeklickte Schaltfläche mit dem Aufruf der Methode sender().


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


Zwei Tasten sind mit demselben Steckplatz verbunden.


def buttonClicked(self):

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


Wir ermitteln die Signalquelle durch den Aufruf der sender()-Methode. Zeigt in der Statusleiste der Anwendung die Bezeichnung der gedrückten Schaltfläche an.

Nachdem das Programm ausgeführt wurde

Ereignisse und Signale, die Sie jeden Tag in PyQt5 lernen müssen

Benutzerdefinierte Ausgabe von Signalen

Objekte, die aus einem QObject erstellt wurden, können Signale senden . Im folgenden Beispiel sehen wir uns an, wie wir das ausgegebene Signal anpassen können.


#!/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_())


Wir erstellen ein neues Signal namens closeApp. Dieses Signal gibt ein Mausdruckereignis aus. Dieses Signal ist mit dem close()-Slot in QMainWindow verbunden.


class Communicate(QObject):
 closeApp = pyqtSignal()


Erstellen Sie eine von QObject geerbte Communicate-Klasse, die über eine Eigenschaft der pyqtSignal()-Klasse verfügt.


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


Verbinden Sie unser benutzerdefiniertes closeApp-Signal mit dem close()-Slot in QMainWindow.


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


Wenn unsere Maus auf das Programmfenster klickt, wird das closeApp-Signal ausgegeben (emit). Anwendung beendet.

Verwandte Empfehlungen:

Python PyQt4 implementiert den QQ-Schubladeneffekt

PyQt implementiert den Interface-Flip-Switching-Effekt


Das obige ist der detaillierte Inhalt vonEreignisse und Signale, die Sie jeden Tag in PyQt5 lernen müssen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn