python 波形发生_事件与信号
事件 Event
所有的GUI程序都是事件驅(qū)動(dòng)的。事件主要由用戶觸發(fā),但也可能有其他觸發(fā)方式:例如網(wǎng)絡(luò)連接、window manager或定時(shí)器。當(dāng)我們調(diào)用QApplication的exec_()方法時(shí)會(huì)使程序進(jìn)入主循環(huán)。主循環(huán)會(huì)獲取并分發(fā)事件。
在事件模型中,有三個(gè)參與者:
事件源
事件對(duì)象
事件接收者
事件源是狀態(tài)發(fā)生變化的對(duì)象。它會(huì)生成事件。事件(對(duì)象)封裝了事件源中狀態(tài)的變動(dòng)。事件接收者是要通知的對(duì)象。事件源對(duì)象將事件處理的工作交給事件接收者。
PyQt5有一個(gè)獨(dú)特的signal&slot(信號(hào)槽)機(jī)制來處理事件。信號(hào)槽用于對(duì)象間的通信。signal在某一特定事件發(fā)生時(shí)被觸發(fā),slot可以是任何callable對(duì)象。當(dāng)signal觸發(fā)時(shí)會(huì)調(diào)用與之相連的slot。
importsysfrom PyQt5.QtCore importQtfrom PyQt5.QtWidgets import(QWidget, QLCDNumber, QSlider,
QVBoxLayout, QApplication)classExample(QWidget):def __init__(self):
super().__init__()
self.initUI()definitUI(self):
lcd= QLCDNumber(self) #創(chuàng)建LCD數(shù)字對(duì)象
sld = QSlider(Qt.Horizontal, self) #創(chuàng)建滑塊水平拉動(dòng)
vbox= QVBoxLayout() #垂直布局管理器
vbox.addWidget(lcd) #為lcd和sld布局,因?yàn)榇怪彼砸簧弦幌?/p>
vbox.addWidget(sld)
self.setLayout(vbox)
sld.valueChanged.connect(lcd.display)#這個(gè)例子中展示了一個(gè)QtGui.QLCDNumber和QtGui.QSlider。
#lcd的值會(huì)隨著滑塊的拖動(dòng)而改變。
#在這里我們將滾動(dòng)條的valueChanged信號(hào)連接到lcd的display插槽。
#sender是發(fā)出信號(hào)的對(duì)象。receiver是接收信號(hào)的對(duì)象。slot(插槽)是對(duì)信號(hào)做出反應(yīng)的方法。
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_())
按鍵觸發(fā)事件
設(shè)置按鍵觸發(fā),需要要到QWidget下的keyPressEvent方法,不過我們可自定制
importsysfrom PyQt5.Qt importQtfrom PyQt5.QtWidgets importQApplication,QWidgetclassExample(QWidget):def __init__(self):
super().__init__()
self.initUI()definitUI(self):
self.setWindowTitle("biao")
self.setGeometry(300,300,300,300)
self.show()def keyPressEvent(self, QKeyEvent): #自定義按鍵觸發(fā)事件
if QKeyEvent.key() == Qt.Key_Escape: #當(dāng)按鍵為Exs時(shí)
self.close()if __name__ == '__main__':
app=QApplication(sys.argv)
ex=Example()
sys.exit(app.exec_())
事件發(fā)送者
有時(shí)需要知道信號(hào)是由哪個(gè)控件發(fā)出的。對(duì)此PyQt5提供了sender()方法。
1 from PyQt5.QtWidgets importQMainWindow,QApplication,QPushButton2 importsys3
4 classExample(QMainWindow):5
6 def __init__(self):7 super().__init__()8
9 self.initUI()10
11 definitUI(self):12
13 btn1 = QPushButton("按鈕1",self)14 btn1.move(30,30)15 btn2 = QPushButton("按鈕2",self)16 btn2.move(130,30)17
18 btn1.clicked.connect(self.buttonCliked) #創(chuàng)立事件,當(dāng)btn被點(diǎn)擊時(shí)
19 btn2.clicked.connect(self.buttonCliked)20 self.statusBar() #用QMainWindow才能有狀態(tài)欄,菜單欄,工具欄
21
22 self.setGeometry(300,300,300,300)23 self.setWindowTitle("biaobiao")24 self.show()25
26 defbuttonCliked(self):27 #通過調(diào)用sender()方法來判斷信號(hào)源, 并將其名稱顯示在窗體的狀態(tài)欄中。
28 sender = self.sender() #獲取sender對(duì)象
29 self.statusBar().showMessage(sender.text()+'was pressed') #獲取信號(hào)源名稱
30
31 if __name__ == '__main__':32
33 app =QApplication(sys.argv)34 ex =Example()35 sys.exit(app.exec_())
發(fā)出信號(hào)
通過QObject創(chuàng)建的對(duì)象可以發(fā)出信號(hào)
信號(hào)要與事件連接,事件由事件管理器處理器控制
importsysfrom PyQt5.QtWidgets importQMainWindow,QApplicationfrom PyQt5.QtCore importQObject,pyqtSignalclass Communicate(QObject): #創(chuàng)建連接
closeAPP =pyqtSignal() #創(chuàng)建信號(hào)
classExmple(QMainWindow):def __init__(self):
super().__init__()
self.initUI()definitUI(self):
self.c= Communicate() #創(chuàng)建連接
self.c.closeAPP.connect(self.close) #信號(hào)連接事件
self.setWindowTitle("biaobiao")
self.setGeometry(300,300,300,300)
self.show()def mousePressEvent(self, event): #事件處理器
self.c.closeAPP.emit()if __name__ == '__main__':
app=QApplication(sys.argv)
ex=Exmple()
sys.exit(app.exec_())
總結(jié)
以上是生活随笔為你收集整理的python 波形发生_事件与信号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVVM之旅
- 下一篇: 西门子STEP7、博图里的数据块(DB)