Pyqt4學習筆記-事件和信號


調用應用的 exec_() 方法之后,應用進入主循環。主循環獲取事件並把它們發往對象。應用在它的生命周期中產生的不同事件交互。事件主要由用戶產生,但是它們也可以由其他方式產生,如:互聯網,窗口管理器,定時器,當一個特殊的事件發生時,將發射信號,“槽 ”可以是任何Python調用,當鏈接到槽的信號發射,該槽將被調用。

在事件模型中,有三個參與者:
event source:事件源,事件來源對象代理了事件的目標要處理的任務
event object:事件對象,指狀態改變的對象,它產生了事件。 事件對象 (Event)封裝了事件源的狀態改變。
event target:事件目標,事件對象想要想要通知的對象,貌似這個不是必須的。

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

import sys
from PyQt4 import QtGui, QtCore


class LcdSlider(QtGui.QWidget):

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

        self.initUI()

    def initUI(self):

        lcd = QtGui.QLCDNumber(self)
        # 初始化數字LCD面板
        slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
        # 初始化水平滑塊

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(slider)

        self.setLayout(vbox)

        self.connect(slider,  QtCore.SIGNAL('valueChanged(int)'), lcd,
                     QtCore.SLOT('display(int)'))
        # 滑塊為事件源,當滑塊收到valuechange(int)的信號之后,lcd的被指定的“槽”display(int)會被調用

        self.setWindowTitle('Signal & slot')
        self.resize(250, 150)


app = QtGui.QApplication(sys.argv)
ex = LcdSlider()
ex.show()
sys.exit(app.exec_())

connect方法有4個參數,sender是發送信號的對象,signal是發射的信號,receiver是接收信號的對象,slog是對信號反應的方法。

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

import sys
from PyQt4 import QtGui, QtCore


class EscapeExample(QtGui.QWidget):

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

        self.setWindowTitle('Escape')
        self.resize(250, 150)

    # 重新實現指定按鈕被按下的事件處理程序
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.close()


app = QtGui.QApplication(sys.argv)
ex = EscapeExample()
ex.show()
sys.exit(app.exec_())

重新實現了 keyPressEvent() 處理。按下ESC會自動退出。

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

import sys
from PyQt4 import QtGui, QtCore


class SenderExample(QtGui.QMainWindow):

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

        self.initUI()

    def initUI(self):

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

        button2 = QtGui.QPushButton("Button 2", self)
        button2.move(150, 50)

        # 接收到clicked信號時調用buttonClicked
        self.connect(button1, QtCore.SIGNAL('clicked()'),
                     self.buttonClicked)

        self.connect(button2, QtCore.SIGNAL('clicked()'),
                     self.buttonClicked)

        self.statusBar().showMessage('Ready')
        self.setWindowTitle('Event sender')
        self.resize(290, 150)


    def buttonClicked(self):

        sender = self.sender()
        # sender可用來獲取信號源
        self.statusBar().showMessage(sender.text() + ' was pressed')

app = QtGui.QApplication(sys.argv)
ex = SenderExample()
ex.show()
sys.exit(app.exec_())

兩個按鈕都連接了同一個信號,按鈕被按下的時候狀態欄會顯示按鈕的標簽。

自定義信號:

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

import sys
from PyQt4 import QtGui, QtCore


class EmitExample(QtGui.QWidget):

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

        self.initUI()

    def initUI(self):

        # 自己創建一個信號,接收后關閉程序
        self.connect(self, QtCore.SIGNAL('closeEmitApp()'),
                     QtCore.SLOT('close()'))

        self.setWindowTitle('emit')
        self.resize(250, 150)


    def mousePressEvent(self, event):
        # 通過 emit() 方法發射信號
        self.emit(QtCore.SIGNAL('closeEmitApp()'))


app = QtGui.QApplication(sys.argv)
ex = EmitExample()
ex.show()
sys.exit(app.exec_())

單擊鼠標程序會關閉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM