读Pyqt4教程,带你入门Pyqt4 _004
在PyQt4教程的这部分中,我们将探讨应用中事件和信号的发生。
事件是GUI程序的重要部分,由用户或者系统产生。当我们调用应用的 exec_() 方法,应用进入主循环。主循环获取事件并把它们发往对象。Trolltech引入了独一无二的信号和槽机制。
事件是GUI程序的主要部分,所有GUI应用程序都是事件驱动的。应用在它的生命周期中产生的不同事件交互。事件主要由用户产生,但是它们也可以由其他方式产生,如:互联网,窗口管理器,定时器。在事件模型中,由三个参与者:
- 事件来源
- 事件对象
- 事件目标
事件对象 是指状态改变的对象,它产生了事件。 事件对象 (Event)封装了事件元的状态改变。 事件目标 是事件对象想要想要通知的对象。事件来源对象代理了事件的目标要处理的任务。
当我们调用了程序 exec_() 方法,程序进入了主循环。主循环捕获事件并把它们发往对象。信号和槽用于对象之间的通讯。当一个特殊的事件发生时,将发射 信号 , 槽 可以是任何Python调用,当链接到槽的信号发射,该槽将被调用。
信号和槽
#!/usr/bin/python
# -*- coding: utf-8 -*- # sigslot.py 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)
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)')) self.setWindowTitle('Signal & slot')
self.resize(250, 150) app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
在我们的例子中,我们显示了一个LCD数字和一个滑块,通过拖动滑块来改变LCD的值。
connect 方法有4个参数, sender 是发送信号的对象, signal 是发射的信号, receiver 是接收信号的对象, 最后, slog 是对信号反应的方法。
重新实现事件处理程序
PyQt4中的事件经常被重新实现。
#!/usr/bin/python
# -*- coding: utf-8 -*- # escape.py import sys
from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self):
super(Example, 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 = Example()
ex.show()
sys.exit(app.exec_())
在我们的例子中,我们重新实现了 keyPressEvent() 处理。
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.close()
如果我们按下了escape按钮,程序将退出。
事件发送者
有时需要方便的知道哪个组件发出的信号,PyQt4有 sender() 方法。
#!/usr/bin/python
# -*- coding: utf-8 -*- # sender.py 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) 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()
self.statusBar().showMessage(sender.text() + ' was pressed') app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
这个了例子中由两个按钮,在 buttonClicked() 方法中我们通过调用 sender() 方法确定点击了哪个按钮。
self.connect(button1, QtCore.SIGNAL('clicked()'),
self.buttonClicked) self.connect(button2, QtCore.SIGNAL('clicked()'),
self.buttonClicked)
两个按钮都连接了同一个信号。
def buttonClicked(self): sender = self.sender()
self.statusBar().showMessage(sender.text() + ' was pressed')
通过调用 sender() 方法我们确定信号来源。在程序的状态栏,我们显示按下的按钮的标签。
发射信号
从 QtCore.QObject 继承的对象可以发射信号。如果点击按钮,将产生一个 clicked() 信号。在接下来的例子中可以看到如何发射信号。
#!/usr/bin/python
# -*- coding: utf-8 -*- # emit.py import sys
from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self):
super(Example, 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):
self.emit(QtCore.SIGNAL('closeEmitApp()')) app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
我们创建一个名为 closeEmitApp() 的新信号,在鼠标的按下实践中发射该信号。
def mousePressEvent(self, event):
self.emit(QtCore.SIGNAL('closeEmitApp()'))
通过 emit() 方法发射信号。
self.connect(self, QtCore.SIGNAL('closeEmitApp()'),
QtCore.SLOT('close()'))
这里我们把手工创建的 closeEmitApp() 信号和 close() 槽连接。
本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4528180.html
读Pyqt4教程,带你入门Pyqt4 _004的更多相关文章
- 读Pyqt4教程,带你入门Pyqt4 _009
QLineEdit QLineEdit 窗口组件用来输入或者编辑单行纯文本,有撤销/重做,剪切/粘贴和拖放功能. #!/usr/bin/python # -*- coding: utf-8 -*- # ...
- 读Pyqt4教程,带你入门Pyqt4 _005
对话框窗体或对话框是现代GUI应用不可或缺的一部分.dialog定义为两个或多个人之间的交谈.在计算机程序中dialog是一个窗体,用来和程序“交谈”.对话框用来输入数据.修改数据.改变程序设置等等. ...
- 读Pyqt4教程,带你入门Pyqt4 _003
编程中的一个重要事情是布局管理,布局管理是如何在窗体上摆放窗口组件.可以有两种方式进行管理:绝对定位或使用布局类. 绝对定位 程序员用像素指定每个控件的位置和尺寸.使用绝对定位时,你必须理解几件事情. ...
- 读Pyqt4教程,带你入门Pyqt4 _002
在这节教程中,我们将创建菜单和工具栏. QMainWindow 类提供应用程序主窗口,可以创建一个经典的拥有状态栏.工具栏和菜单栏的应用程序骨架. 菜单栏 菜单栏是GUI应用程序最明显的部分之一,这是 ...
- 读Pyqt4教程,带你入门Pyqt4 _013
你是否曾经看着应用程序并思考特定的GUI项是如何产生的?大概每位程序员都这样过.然后你能看到你喜欢的GUI库提供的一系列窗口组件,但是你无法找到它.工具包通常仅仅提供最常用的窗口组件,比如按钮.文本组 ...
- 读Pyqt4教程,带你入门Pyqt4 _012
颜色 颜色是指一个代表红(Red).绿(Green).蓝(Blue)(RGB)强度值组合的对象,有效的RGB值在0~255之间.我们可以用多种方式定义颜色,最常用的是RGB十进制或者十六进制值.也可以 ...
- 读Pyqt4教程,带你入门Pyqt4 _010
在PyQt4教程的这部分中,我们讨论拖放操作. 拖放(Drag-and-drop)指的是图形用户界面(Graphical user interface)中,在一个虚拟的对象上按着鼠标键将之拖曳到另一个 ...
- 读Pyqt4教程,带你入门Pyqt4 _006
窗口组件是应用程序的基本构建块.PyQt4编程工具包拥有范围广泛的各种窗口组件.按钮.选择框.滑块.列表框等等,程序员工作所需要的一切.在教程的这部分中,我们将介绍一些有用的窗口组件. QCheckB ...
- 读Pyqt4教程,带你入门Pyqt4 _008
QCalendarWidget QCalendarWidget 提供基于月份的日历窗口组件,它允许用户简单并且直观的选择日期. #!/usr/bin/python # -*- coding: utf- ...
随机推荐
- 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示
一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...
- docker 安装centos7并SSH远程连接
1.安装centos7 镜像 1.搜索并拉取centos镜像(默认最新镜像) docker search centos docker pull centos 2.建立本机对应docker-centos ...
- Python解决钻石小偷问题
题目如下: A:我没有偷钻石. B:D就是罪犯. C:B是盗窃这块钻石的罪犯. D:B有意诬陷我. 假定只有一个人说的是真话,编程序判断谁偷走了钻石. 答案是:说真话的是D,罪犯是A,逻辑思路可以百度 ...
- spring源码阅读笔记10:bean生命周期
前面的文章主要集中在分析Spring IOC容器部分的原理,这部分的核心逻辑是和bean创建及管理相关,对于单例bean的管理,从创建好到缓存起来再到销毁,其是有一个完整的生命周期,并且Spring也 ...
- 说一说Web开发中两种常用的分层架构及其对应的代码模型
昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...
- 学习Vue第二节,v-cloak,v-text,v-html,v-bind,v-on使用
v-cloak,v-text,v-html,v-bind,v-on使用 <!DOCTYPE html> <html> <head> <meta charset ...
- 201771010113 李婷华 《面向对象程序设计(Java)》第十三周总结
一.理论知识部分 第十一章 事件处理 事件源 (event source):能够产生事件的对象都可 以成为事件源 ,如文本框 .按钮等 .一个事件源是一个能够注册监听器并向发送事件对象的对象. 监听器 ...
- Code::Blocks无法调试 Starting the debuggee failed: No executable specified, use `target exec'
1.必须建立工程 2.工程名不可有特殊字符或空格,可以有字母.数字.下划线 2.编译器设置里勾选-g(产生调试符号) 3.重新编译项目(如果之前编译过了) 4.调试器设置 > Default & ...
- 【HBase】通过Bulkload批量加载数据到Hbase表中
目录 需求 步骤 一.开发MapReduce 二.打成Jar包放到linux执行 三.有两种办法将HFile文件加载到HBase表中 开发代码 Hadoop命令运行 需求 将hdfs上面的这个路径 / ...
- 出现Please make sure you have the correct access rights and the repository exists.问题解决
问题: 有一段时间没有用码云了,当输入 git push -u origin master命令出现Please make sure you have the correct access rights ...