ホームページ >バックエンド開発 >Python チュートリアル >PyQt5 で毎日学習する必要があるイベントとシグナル

PyQt5 で毎日学習する必要があるイベントとシグナル

不言
不言オリジナル
2018-04-20 13:59:453304ブラウズ

この記事では、PyQt5 で毎日学習する必要があるイベントとシグナルに関する関連情報を主に詳しく紹介します。興味のある方は参考にしてください。

このパートでは、PyQt5 のイベントとシグナルについて説明します。アプリケーションに実装する方法。

イベント

すべての GUI アプリケーションはイベント駆動型です。アプリケーション イベントは主にユーザーによって生成されますが、インターネット接続、ウィンドウ マネージャー、タイマーなどの他の方法によって生成されることもあります。アプリケーションの exec_() メソッドを呼び出すと、アプリケーションはメイン ループに入ります。メインループはさまざまなイベントを検出し、イベントオブジェクトに送信します。

イベント モデルには、次の 3 つの参加者があります:

  • イベント ソース (イベント ソース)

  • イベント オブジェクト (イベント オブジェクト)

  • イベント ターゲット (イベント ターゲット)

イベント ソースis イベントは、オブジェクトの状態が変化すると生成されます。イベント オブジェクト (イベント) は、イベント ソース内の状態変化をカプセル化するオブジェクトです。イベントターゲットは、通知を受け取りたいオブジェクトです。イベント ソース オブジェクトは、イベント ターゲットに対するイベントを処理するタスクを表します。

PyQt5 は、独自のシグナルとスロットのメカニズムを使用してイベントを処理します。シグナルとスロットは、オブジェクト間の通信に使用され、特定のイベントが発生するとシグナルが発行されます。スロットには任意の Python 呼び出しを使用できます。信号は、それに接続されているスロットが呼び出されるときに送信されます。

シグナルとスロットシグナルとスロット

これは、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_())


この例では、QtGui.QLCDNumber と QtGui.QSlider が使用されます。スライダーをドラッグして LCD の番号を変更します。


sld.valueChanged.connect(lcd.display)


ここで、スライダーのvalueChanged信号はLCDの表示スロットに接続されています。

送信者は信号を送信するオブジェクトです。受信機は信号を受信するオブジェクトです。スロットは信号へのフィードバック方法です。

プログラム実行後

PyQt5 で毎日学習する必要があるイベントとシグナル

システムイベントハンドラーを上書きする

PyQt5でのイベント処理はイベントハンドラーを書き換えることで行われることが多いです。


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


この場合、keyPressEvent() イベント ハンドラーを再実装します。


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


キーボードのEscキーを押すと、アプリケーションが終了します。

イベント送信側イベント送信

同じイベントターゲットに接続されている複数のイベントソースを簡単に区別するために、PyQt5ではsender()メソッドを使用できます。


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


この場合、ボタンは 2 つあります。どちらのボタンも buttonClicked() メソッドに接続されており、クリックされたボタンに応答して sender() メソッドを呼び出します。


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


2 つのボタンが同じスロットに接続されています。


def buttonClicked(self):

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


sender() メソッドを呼び出して信号ソースを特定します。アプリケーションのステータスバーに、押されたボタンのラベルが表示されます。

プログラムの実行後

PyQt5 で毎日学習する必要があるイベントとシグナル

カスタマイズされたシグナルの放出

QObject から作成されたオブジェクトはシグナルを放出できます。以下の例では、送信される信号をカスタマイズする方法を見ていきます。


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


closeApp という新しいシグナルを作成します。この信号はマウス プレス イベントを発行します。この信号は QMainWindow の close() スロットに接続されます。


class Communicate(QObject):
 closeApp = pyqtSignal()


QObject から継承した Communicate クラスを作成します。これは、pyqtSignal() クラスのプロパティを持ちます。


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


カスタム closeApp シグナルを QMainWindow の close() スロットに接続します。


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


マウスがプログラムウィンドウをクリックすると、closeAppシグナルが発せられます(emit)。アプリケーションは終了しました。

関連する推奨事項:

Python PyQt4はQQドロワー効果を実装します

PyQtはインターフェースフリップスイッチング効果を実装します


以上がPyQt5 で毎日学習する必要があるイベントとシグナルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。