PySide——Python图形化界面入门教程(四)
PySide——Python图形化界面入门教程(四)
              ——创建自己的信号槽
——Creating Your Own Signals and Slots
翻译自:http://pythoncentral.io/pysidepyqt-tutorial-creating-your-own-signals-and-slots/
你不必局限于Qt widget提供的信号,你可以使用Signal类来创建自己的信号。下面是一个定义的简单例子:
from PySide.QtCore import Signal
tapped = Signal()
然后,当对象需要触发信号的条件满足时,你可以使用信号的emit方法,来发出信号调用关联的槽。
thing.tapped.emit()
这样做有两个优点:第一,允许用户和你定义的对象随意交互;第二,让你的对象使用更加灵活,让自己的代码定义动作行为的影响。
一个简单的PySide信号例子
我们来定义一个简单的PunchingBag类,它只做一件事情,当punch被调用时,发出punched信号:
from PySide.QtCore import QObject, Signal, Slot class PunchingBag(QObject):
''' Represents a punching bag; when you punch it, it
emits a signal that indicates that it was punched. '''
punched = Signal() def __init__(self):
# Initialize the PunchingBag as a QObject
QObject.__init__(self) def punch(self):
''' Punch the bag '''
self.punched.emit()
代码非常的简单:PunchingBag继承自QObject,所以它可以发出信号;它有一个称为punched的信号,不携带任何数据;并且他有一个仅仅发出punched信号的punch方法。
为了让PunchingBag更丰富一些,我们需要将它的punched信号和一个槽连接。槽简单的输出“Bag was punched”。
@Slot()
def say_punched():
''' Give evidence that a bag was punched. '''
print('Bag was punched.') bag = PunchingBag()
# Connect the bag's punched signal to the say_punched slot
bag.punched.connect(say_punched) # Punch the bag 10 times
for i in range(10):
bag.punch()
携带数据的PySide信号
创建信号可以完成一个非常有用的事情——携带数据。例如,你可以创建一个携带整数或者字符串的信号:
updated = Signal(int)
updated = Signal(str)
这个数据类型可以是任何Python的类型名或定义了C++类型的字符串。因为教程不假设有任何C++的知识,故我们只使用Python类型。
例子:一个发送信号的圆
我们用x,y和r定义一个圆,x、y是圆中心的坐标,r是半径。我们想要当圆被改变大小时,发送一个信号resized;当圆被移动时,也发送一个信号moved。虽然我们可以在信号的槽中检测圆的大小和位置,但是使用信号发送这些信息会更加方便。
from PySide.QtCore import QObject, Signal, Slot class Circle(QObject):
''' Represents a circle defined by the x and y
coordinates of its center and its radius r. '''
# Signal emitted when the circle is resized,
# carrying its integer radius
resized = Signal(int)
# Signal emitted when the circle is moved, carrying
# the x and y coordinates of its center.
moved = Signal(int, int) def __init__(self, x, y, r):
# Initialize the Circle as a QObject so it can emit signals
QObject.__init__(self) # "Hide" the values and expose them via properties
self._x = x
self._y = y
self._r = r @property
def x(self):
return self._x @x.setter
def x(self, new_x):
self._x = new_x
# After the center is moved, emit the
# moved signal with the new coordinates
self.moved.emit(new_x, self.y) @property
def y(self):
return self._y
@y.setter
def y(self, new_y):
self._y = new_y
# After the center is moved, emit the moved
# signal with the new coordinates
self.moved.emit(self.x, new_y) @property
def r(self):
return self._r @r.setter
def r(self, new_r):
self._r = new_r
# After the radius is changed, emit the
# resized signal with the new radius
self.resized.emit(new_r)
注意以下几点:
- Circle继承自QObject所以可以发送信号
 - 同样的信号可以在不同地方发送
 
现在我们定义一些连接Circle的信号的槽。还记得我们上次提过的@Slot修饰符(decorator)吗?现在我们来看看如何接收携带了数据的信号。为了接收信号,我们简单的将其定义为与信号一样的结构。
# A slot for the "moved" signal, accepting the x and y coordinates
@Slot(int, int)
def on_moved(x, y):
print('Circle was moved to (%s, %s).' % (x, y)) # A slot for the "resized" signal, accepting the radius
@Slot(int)
def on_resized(r):
print('Circle was resized to radius %s.' % r)
非常的简单直观。更多信息可以参考Python decorators,或者来学习这篇文章Python Decorators Overview。最后我们完成这个Circle,连接信号槽,移动并改变它的大小。
c = Circle(5, 5, 4) # Connect the Circle's signals to our simple slots
c.moved.connect(on_moved)
c.resized.connect(on_resized) # Move the circle one unit to the right
c.x += 1 # Increase the circle's radius by one unit
c.r += 1
当运行脚本的时候,你的结果应该是:
Circle was moved to (6, 5).
Circle was resized to radius 5.
现在我们对信号和槽有了更深入的了解,可以准备使用一些更高级的widgets了。下一个教程开始讨论QListWidget和QListView,两种创建表框(list box)控件的方法。
By Ascii0x03
转载请注明出处:http://www.cnblogs.com/ascii0x03/p/5500933.html
PySide——Python图形化界面入门教程(四)的更多相关文章
- PySide——Python图形化界面入门教程(六)
		
PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...
 - PySide——Python图形化界面入门教程(五)
		
PySide——Python图形化界面入门教程(五) ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistw ...
 - PySide——Python图形化界面入门教程(三)
		
PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...
 - PySide——Python图形化界面入门教程(二)
		
PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...
 - PySide——Python图形化界面入门教程(一)
		
PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-to-pysidepyqt-basic-w ...
 - PySide——Python图形化界面
		
PySide——Python图形化界面 PySide——Python图形化界面入门教程(四) PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your ...
 - python+pycharm+PyQt5 图形化界面安装教程
		
python图形化界面安装教程 配置环境变量 主目录 pip所在目录,及script目录 更新pip(可选) python -m pip install --upgrade pip ps:更新出错一般 ...
 - Oracle数据库及图形化界面安装教程详解
		
百度云盘oracle数据库及图形化界面安装包 链接: https://pan.baidu.com/s/1DHfui-D2n1R6_ND3wDziQw 密码: f934 首先在电脑D盘(或者其他不是C盘 ...
 - 如何使用python图形化界面wxPython
		
GUI库主要有三类:tkinter,wxPython和PyQt5,下面主要是针对wxPython的使用说明. 下面的操作均在win10 + pycharm上进行 wxPython的安装: pip in ...
 
随机推荐
- [Jest] Snapshot
			
The problem we face daily when we do testing: The Data structure may changing, component outlook mig ...
 - [Angular] USING ZONES IN ANGULAR FOR BETTER PERFORMANCE
			
Link to the artical. Zone detects any async opreations. Once an async oprations happens in Angular, ...
 - 简洁常用权限系统的设计与实现(三):维护和利用节点的深度level,迭代实现树的构造
			
如果在节点的属性中,增加一个level属性,即树的深度,构造树会非常容易.前提是,增加和修改节点的时候,要维护level. 根节点的level为1,下一级为2,以此类推. 构造树的方法,主要有2个: ...
 - Android网络应用之Socket(一)
			
socket编程是网络通信的一个基础应用.不管是手机端还是PC端都须要socket技术来建立网络通信. 在本章小编主要从下面几个方面来介绍socket的相关知识: 各自是"什么是socket ...
 - STL源代码学习--vector用法汇总
			
一.容器vector 使用vector你必须包含头文件<vector>: #include<vector> 型别vector是一个定义于namespace std内的templ ...
 - BZOJ 3932 - 主席树
			
传送门 题目分析 在只打会主席树模板的情况下做了这道题,也算是深有体会. 首先任务可以差分:一个任务是(s, e, p), 则在s处+1, 在e+1处-1,符合前缀.但是我们要查询指定时间的前k任务之 ...
 - hadoop 3.x Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
			
启动hdfs后执行share目录中自带的mapreduce程序时报如下错误 找到$HADOOP_HOME/etc/mapred-site.xml,增加以下配置 <property> < ...
 - 源码分析之Dictionary笔记
			
接下来我们一步步来熟悉 Dictionary的底层结构实现,下面的MyDictionary等同于源码中的Dictionary看待. 首先我们定义一个类 MyDictionary,类中定义一个结构Ent ...
 - Android 开发新方向 Android Wear ——概述
			
2014 谷歌 I/O大会正式公布的Android Wear 开发理念,从而能够更系统的提供开发人员使用Android接口开发便携式可穿戴设备,以智能手表为例,通过Android提供的接口,能够方便的 ...
 - Arraylist   和  linkedlist   ||  hashset 和treeset.   ||    hashMap 和  TreeMap
			
参考:http://liuyuan418921673.iteye.com/blog/2256120 1. ArrayList和LinkedList的区别和使用场景 ArryList 与linked ...