調用應用的 exec_() 方法之後,應用進入主迴圈。主迴圈獲取事件並把它們發往對象。應用在它的生命周期中產生的不同事件交互。事件主要由用戶產生,但是它們也可以由其他方式產生,如:互聯網,視窗管理器,定時器,當一個特殊的事件發生時,將發射信號,“槽 ”可以是任何Python調用,當鏈接到槽的信號發射
調用應用的 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_())
單擊滑鼠程式會關閉。