码迷,mamicode.com
首页 > 其他好文 > 详细

PyQt4(3)

时间:2015-12-06 22:29:27      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

事件

所有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就被发射,程序起作用。

PyQt4(3)

标签:

原文地址:http://www.cnblogs.com/thenewone/p/5024449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!