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_())

单击鼠标程序会关闭。

时间: 2024-11-05 04:48:11

Pyqt4学习笔记-事件和信号的相关文章

angularjs学习笔记—事件指令

angularjs学习笔记—事件指令 小俞 4.4k 3月30日 发布 推荐 4 推荐 收藏 17 收藏,11.1k 浏览 ngClick 适用标签:所有触发条件:单击 #html <div ng-controller="LearnCtrl"> <div ng-click="click()">click me</div> <button ng-click="click()">click me<

OGEngine学习笔记--- 事件传递

事件传递 Android中的事件在表现形式上有很多,如onTouch.onClick和onLongClick等,在具体微观上的表现形势有action_down.action_move和action_up等. 无论哪种事件表现类型,首先都是基于事件的传递模型.其实Android中的事件传递有点类似于JS中事件传递模型.都是基于先捕获然后冒泡的形式. 在OGEngine的API中,OGEngine负责捕获触摸事件,如果我们需要监听触摸事件,则需要向Scene注册. mScene.registerTo

JS学习笔记-事件绑定

一.传统事件模型 传统事件模型中存在局限性. 内联模型以HTML标签属性的形式使用,与HTML混写,这种方式无疑造成了修改以及扩展的问题,已经很少使用了. 脚本模型是将事件处理函数写到js文件中,从页面获取元素进行对应事件函数的绑定以触发执行.但也存在不足之处: 1.一个事件绑定多个事件监听函数,后者将覆盖前者. 2.需要限制重复绑定的情况 3.标准化event对象 二.现代事件绑定 DOM2级事件定义了两个方法用于添加.删除事件:addEventListener().removeEventLi

APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int kill(pid_t pid,int signo); int raise(int signo); Both return: 0 if OK,?1 on error kill向进程号为pid的进程发送signo信号 能够看出 以下两行代码是等价的: kill(getpid(), signo); raise(sig

Pyqt4学习笔记-对话框(更新ing)

QInputDialog:可交互输入单个值的对话框.输入值可以是一个字符串,一个数字或者列表的一项. #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui from PyQt4 import QtCore class InputExample(QtGui.QWidget): def __init__(self): super(InputExample, self).__init__() self.

Pyqt4学习笔记-菜单工具栏

显示状态栏: #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.resize(250, 150) self.setWindowTitle('Mainwindow') self.statusB

js学习笔记-事件代理

通过事件代理,你可以把事件处理器绑定到父元素上,避免了把事件处理器添加到多个子级元素上.从而优化性能. 事件代理用到了事件冒泡和目标元素.而任何一个元素的目标元素都是一开始的那个元素. 这里首先要注意event的target与currentTarget的区别. target:表示触发事件的元素.currentTarget:表示事件绑定的元素. 只有当事件流处在目标阶段的时候,两个的指向才是一样的, 而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件

PyQt5学习笔记05----Qt Designer信号槽

先入一些信号槽的基本介绍: 信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方.它为高层次的事件处理自动生成所需要的附加代码.在我们所熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针.但是,在 QT 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了. 所有从 QObject 或其子类 ( 例如 Qwidget) 派生的

JavaScript 学习笔记— —事件委托

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //事件委托:利用冒泡的原理,把事件加到父级上,触发执行效果 //好处 //1.提高性能 //2.新添加的元素,还会有之前的事件 //event