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

不言
リリース: 2018-04-20 13:59:45
オリジナル
3250 人が閲覧しました

この記事では、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート