标签:
事件
所有GUI应用程序都是事件-驱动模式。
在事件模型中,有三个参与者:
事件源
事件对象
事件目标
事件源是对象状态的变化,它引发事件。事件对象则封装了事件源中的状态的变化。事件目标是事件想要通知的目标。
PyQt4中具有独特的信号和槽机制来处理事件,信号和时隙(slots)用于对象之间的通信。当一个特定的事件发生时,信号将被发射。时隙能被Python调用,当连接到它的信号被发射时被调用。
用于信号和间隙工作的新API
QtCore.QObject.connect(button,QtCore.SINGAL(‘clicked()‘),self.onClicked)
旧的的API风格
button.clicked.connect(self.onClicked)
1.Signals & Slots
例子:
#!/usr/bin/python #-*- coding: utf-8 -*- """ In this example,we connect a signal of a QtGui.QSlider to a slot of a QtGui.QLCDNumber """ import sys from PyQt4 import QtGui,QtCore class Example (QtGui.QWidget): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): lcd = QtGui.QLCDNumber(self) sld = QtGui.QSlider(QtCore.Qt.Horizontal,self) vbox = QtGui.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() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘: main()
【运行结果】
拖动滑块时,LCD的数字也会跟着改变。
sld.valueChanged.connect(lcd.display)
在这里,滑块的valueChanged信号连接到LCDNumber的显示槽。
2.事件发送
PyQt4有sender()方法可以很方便的知道发送源。
#!/usr/bin/python #-*-coding:utf-8 -*- import sys from PyQt4 import QtGui,QtCore class Example(QtGui.QMainWindow): def __init__(self): super(Example,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) button1.clicked.connect(self.buttonClicked) button2.clicked.connect(self.buttonClicked) self.statusBar() self.setGeometry(300,300,300,150) self.setWindowTitle(‘event sender‘) self.show() def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() +‘ was pressed‘) def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘: main()
【运行结果】
button1.clicked.connect(self.buttonClicked)
button2.clicked.connect(self.buttonClicked)
两个按钮连接着相同的方法。
def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text()+‘ was pressed‘)
定义的buttonClicked方法。
3.发射信号
从QtCore.QObject创建的对象可以发送信号。
#!/usr/bin/python #-*- coding: utf-8 -*- import sys from PyQt4 import QtGui,QtCore class Communicate(QtCore.QObject): closeApp = QtCore.pyqtSignal() class Example(QtGui.QMainWindow): def __init__(self): super(Example,self).__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() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘: main()
例子中创建了一个名为closeApp的新信号。这个信号连接着QtGui.QMainWindow的close()方法。
class Communicate(QtCore.QObject): closeApp = QtCore.pyqtSignal()
closeApp这个类的创建,作为外部通信类。
self.c.closeApp.connect(self.close)
closeApp连接到close()
def mousePreesEvent(self,event): self.c.closeApp.emit()
当在窗口中单击时,closeApp就被发射,程序起作用。
标签:
原文地址:http://www.cnblogs.com/thenewone/p/5024449.html