PyQt 5ベーシックチュートリアル--PyQt 5のイベントと信号[6/13]

6308 ワード

PyQt 5でGUIを书きたいのですが、ネット上のPyQt 5の资源が少なすぎて、英语を见つけて、翻訳して、PyQt 5を勉强している学生と一绪に勉强します!
(本シリーズのすべてのコードはwindows 7 64ビット[]/Python 3.4.3 32 bit/PyQt GPL v 5.5 for Python v 3.4(x 32)/eric 6-6.0.8でテストに合格した.)
元の住所:http://zetcode.com/gui/pyqt5/
================================================================================
この部分では、プログラム内のイベントと信号を研究します.
≪イベント|Events|ldap≫
すべてのGUIプログラムはイベント駆動です.イベントの多くはプログラムのユーザによって生成する.しかし、インターネット接続、ウィンドウマネージャ、または時間などの他の手段によって生成するもよい.プログラムのexecを呼び出すと()メソッドの場合、プログラムはメインサイクルに入る.プライマリループは、イベントを読み出し、特定のオブジェクトに送る.
イベントモデルには、3人の参加者がいます.
イベントソースイベントオブジェクトイベントターゲット
イベントソースは、状態が変化するオブジェクトであり、イベントを生成する.イベントオブジェクト(イベント)は、イベントソースにカプセル化する状態が変化する.イベントのターゲットは通知されたいオブジェクトです.イベントソースオブジェクトは、イベントを処理するタスクをイベントターゲットに割り当てる.
PyQt 5は独特な信号とスロット機構を持ってイベントを処理する.信号とスロットは、オブジェクト間の通信に用いる.1つの信号は、ある特定のイベントが発生するときに送信される.1つのスロットは任意のPython呼び出しである.接続信号が送信ときに呼び出されるスロットがある.
信号とスロット
これはPyQt 5で示す信号とスロットの簡単な例である.
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider, 
    QVBoxLayout, QApplication)


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('Signal & slot')
        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デジタルのdisplayスロットに接続する.
送信者は、信号を送信オブジェクトである.受信者は信号を受信オブジェクトである.溝は信号に作用する方法である.

画像:信号とスロット
リロードイベントハンドラ
PyQt 5におけるイベントは、重荷のイベントプロセッサによって処理することが多い.
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):      
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Event handler')
        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()

終了ボタンをクリックするとプログラムが終了します.
イベント送信者
どの部品が信号の送信者であるかを知ることが便利である場合がある.したがって、PyQt 5にはsender()の方法がある.
import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication


class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):      

        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)

        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)
      
        btn1.clicked.connect(self.buttonClicked)            
        btn2.clicked.connect(self.buttonClicked)
        
        self.statusBar()
        
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Event sender')
        self.show()
        
        
    def buttonClicked(self):
      
        sender = self.sender()
        self.statusBar().showMessage(sender.text() + ' was pressed')
        
        
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() + ' was pressed')
sender()メソッドを呼び出すことによって信号源を決定する.プログラムのステータスバーでは、ボタンラベルがクリックする表示される.

画像:イベント送信者
送信信号
QObjectから作成するオブジェクトは、信号を送信することができる.次の例では、カスタム信号を送信する方法を示します.
#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

In this example, we show how to emit a
signal. 

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

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


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, 290, 150)
        self.setWindowTitle('Emit signal')
        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() 
の信号が作成する、pyqtSignal()はCommunicateクラスの外部属性である.
self.c = Communicate()
self.c.closeApp.connect(self.close) 
のカスタムcloseApp信号は、QMainWindowのclose()スロットに接続する.
def mousePressEvent(self, event):
    
    self.c.closeApp.emit()
ウィンドウでマウスをクリックすると、closeApp信号が送信され、プログラムが終了する.