PySide中的信号和槽

  本文主要介绍在PySide中如何使用信号和槽。传统的使用方式已经在参考文档里给出,我们的重点是解释如何使用新的代码风格来操作信号、槽。

  PyQt中使用信号、槽的新代码风格是在PyQt v4.5中介绍的,这个风格的主要目的是为Python程序员们提供一个符合Python风格的方式。

传统方式:SINGAL和SLOT
  QtCore.SIGNAL和QtCore.SLOT是Python使用Qt信号、槽传送机制的接口。这就是我们所说的旧方式。

  下面这个例子使用了QPushButton的点击信号,而连接方法并非符合python习惯的语法。它需要通知对象,并将它的信号和另外个槽连接。


...
def someFunc():
print "someFunc has been called!"
...

button = QtGui.QPushButton("Call someFunc")
QtCore.QObject.connect(button, QtCore.SIGNAL('clicked()'), someFunc)
...

新风格:Signal()和Slot()
  新风格使用了不同的语法创建并连接信号、槽。前面的例子可以重写如下:


...

def someFunc():
print "someFunc has been called!"

button = QtGui.QPushButton("Call someFunc")
button.clicked.connect(someFunc)

...

使用QtCore.Singal()
  信号可以使用QtCore.Signal()定义。Python类型和C类型都可以作为参数传递给它。假如你需要重载它,只需要用无组或列表地方式传递类型。

  另外,它也可以接受命名参数(named argument) name来定义信号的名称。如果没有传递name,那么信号将会使用赋值变量的名称。

  第二个例子中使用了一组方式来显示如何使用QtCore.Signal()

      注意:信号只能在QObject的子类内定义,这种方式下信号的信息将会加入 QMetaObject结构中。

使用 QtCore.Slot()
  槽可以用QtCore.Slot()赋值或者重载。同样,想定义一个签名仅仅需要传递给QtCore.Singal()一些类型。与Signal()类不同的是,想重载一个函数,你并不需要传递任何的无级或者列表,你需要做的是为每个不同的签名定义一个不同的装饰。如果没看懂没有关系,下面的例子将会让你明了。

  另外一个区别是关键字。Slot()接受一个name和一个result. result关键字定义的是返回值,可以是C或者Python的类型。name则与Signal中的一样。如果没有传递name,则使用函数的名字。

一组例子:
  下面有一组例子,用来显示如何在PySide中定义及连接信号、槽。有一些例子比较简单,有一些则比较复杂。

1. Hello World: 基本的例子,显示不使用任何参数的情况下连接信号和槽

代码


#!/usr/bin/env python

import sys
from PySide import QtCore, QtGui

# define a function that will be used as a slot
def sayHello():
print 'Hello world!'

app = QtGui.QApplication(sys.argv)

button = QtGui.QPushButton('Say hello!')

# connect the clicked signal to the sayHello slot
button.clicked.connect(sayHello)
button.show()

sys.exit(app.exec_())

2. 接着,我们加了一些参数。是从 Hello World版本修改的。槽中添加了一些参数,同时创建了一个新的信号

代码


#!/usr/bin/env python

import sys
from PySide import QtCore

# define a new slot that receives a string and has
# 'saySomeWords' as its name
@QtCore.Slot(str)
def saySomeWords(words):
print words

class Communicate(QtCore.QObject):
# create a new signal on the fly and name it 'speak'
speak = QtCore.Signal(str)

someone = Communicate()
# connect signal and slot
someone.speak.connect(saySomeWords)
# emit 'speak' signal
someone.speak.emit("Hello everybody!")

3. 添加一些重载。简单地修改了前一个例子。下面是重载修饰符

代码


#!/usr/bin/env python

import sys
from PySide import QtCore

# define a new slot that receives a C 'int' or a 'str'
# and has 'saySomething' as its name
@QtCore.Slot(int)
@QtCore.Slot(str)
def saySomething(stuff):
print stuff

class Communicate(QtCore.QObject):
# create two new signals on the fly: one will handle
# int type, the other will handle strings
speakNumber = QtCore.Signal(int)
speakWord = QtCore.Signal(str)

someone = Communicate()
# connect signal and slot properly
someone.speakNumber.connect(saySomething)
someone.speakWord.connect(saySomething)
# emit each 'speak' signal
someone.speakNumber.emit(10)
someone.speakWord.emit("Hello everybody!")

4. 最后一个例子,使用了槽重载以及一些复杂的信号连接及发射。

代码


#!/usr/bin/env python

import sys
from PySide import QtCore

# define a new slot that receives an C 'int' or a 'str'
# and has 'saySomething' as its name
@QtCore.Slot(int)
@QtCore.Slot(str)
def saySomething(stuff):
print stuff

class Communicate(QtCore.QObject):
# create two new signals on the fly: one will handle
# int type, the other will handle strings
speak = QtCore.Signal((int,), (str,))

someone = Communicate()
# connect signal and slot. As 'int' is the default
# we have to specify the str when connecting the
# second signal
someone.speak.connect(saySomething)
someone.speak[str].connect(saySomething)

# emit 'speak' signal with different arguments.
# we have to specify the str as int is the default
someone.speak.emit(10)
someone.speak[str].emit("Hello everybody!")

PyQt兼容模式:
      PyQt使用了另外一种方式。为了将PyQt脚本转而使用PySide运行,只需要使用下面的代码进行修改。


from PySide.QtCore import Signal as pyqtSignal
from PySide.QtCore import Slot as pyqtSlot

或者


QtCore.pyqtSignal = QtCore.Signal
QtCore.pyqtSlot = QtCore.Slot

时间: 2024-08-02 12:09:00

PySide中的信号和槽的相关文章

PySide“.NET研究”中的信号和槽

本文主要介绍在PySide中如何使用信号和槽.传统的使用方式已经在参考文档里给出,我们的重点是解释如何使用新的代码风格来操作信号.槽. PyQt中使用信号.槽的新代码风格是在PyQt v4.5中介绍的,这个风格的主要目的是为Python程序员们提供一个符合Python风格的方式. 传统方式:SINGAL和SLOT QtCore.SIGNAL和QtCore.SLOT是Python使用Qt信号.槽传送机制的接口.这就是我们所说的旧方式. 下面这个例子使用了QPushButton的点击信号,而连接方法

PyQt 5信号与槽的几种高级玩法

信号(Signal)和槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.本文介绍了几种PyQt 5信号与槽的几级玩法. 在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制.当信号发射时,连接的槽函数将会自动执行.在PyQt 5中信号与槽通过object.signal.connect()方法连接. PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号.信号与槽具有如下特点. 一个信

[Qt教程] 第44篇 进阶(四)信号和槽

[Qt教程] 第44篇 进阶(四)信号和槽 楼主  发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容中已经多次用到过信号和槽了,这一节我们将详细讲解信号和槽的机制和使用方式.大家可以在帮助中查看Signals& Slots关键字. 环境:Windows Xp + Qt 4.8.5+QtCreator2.8.0 目录 一.信号和槽机制 二.信号和槽的自动关联 三.信号和槽的高级应用 正文 一.信号和

为什我写的信号和槽不作用啊

问题描述 为什我写的信号和槽不作用啊 我本意是想编写一个信号和槽的函数,让窗口的一个按钮被按下,然后改变该窗口类中已定义好的一个变量的值,再通过一个有返回值的函数将这个值传到类外,供其他使用.这是我的槽. public slots: void set_value(); void test1::set_value(){value=1;} connect(mybutton1,SIGNAL(clicked()),this,SLOT(set_value())); 我同样也声明和实现了传值出去的函数.但一

【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽

Qt是一个跨平台的c++图形用户界面应用程序框架. Qt安装说明: windows下环境变量path需要加入以下路径,以便QT写的程序可以离开QT开发环境独立运行 C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\;C:\Qt\Qt5.2.0\Tools\mingw48_32\bin; linux下需要设置.bash_profile文件 PATH中加入/opt/Qt5.2.0/5.2.0/gcc/bin 用root用户登录系统,进入/usr/lib目录后执行 ln libGL

qtcreator-qt中用信号和槽导致程序挂掉

问题描述 qt中用信号和槽导致程序挂掉 工具是qt creator,qt库版本为5.4,环境是windows 7,在我的程序中有一个信号的参数是(QSringdoubledoubledoubledouble)然后和在同一个类中的私有成员类的信号connect,最后这个私有成员类将此信号和这个私有成员类的私有成员类的槽函数connect,结果运行起来会让程序无缘无故挂掉.调试也发现不了原因,我在猜想是不是因为QString的原因,求有经验的大神赐教 解决方案 给程序的每一步都加个log看看是哪儿的

qt c++-QT使用中关于布局与信号与槽的基础问题,求高手来看看

问题描述 QT使用中关于布局与信号与槽的基础问题,求高手来看看 1.假如在一个QDialog中左边是一个QTreeWidget右边添加一个Qwidget空间,QWidget里面放4个QLabel,用GridLayout布局平分,现在实现双击某一个label,其余3个label隐藏,而只有一个label出现并且填充满整个Qwidget,怎么实现这个过程? 2.在一个QT的button槽函数里,实现对视频文件回放:打开文件解码(解码产生一个getImage(QImage*)信号),然后由这个信号关联

Qt 自定义信号与槽

注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义, //第二个参数信号, //第三个参数this是槽方法所属类的对象,且必须在对象类的头文件的slots下定义 //第四个参数槽方法类,槽 方法 connect(lineEdit,SIGNAL(textChanged(QString)),this,SLOT(showArea())); 使用自定义的信号和槽,需要注意以下几点: 1.类的声明和实现分别放在.h和.cpp文

qt-用QT+VS做界面,没有主函数,那应该在哪里使用connect函数连接信号与槽?

问题描述 用QT+VS做界面,没有主函数,那应该在哪里使用connect函数连接信号与槽? 我准备从A窗口发射信号,由B窗口的槽函数接收, 我在B中创建了A的类实例,在A中写了信号和发射信号的函数 但现在不知道将connect函数写在哪里,看过的教程都是在主函数中写的connect函数 解决方案 http://bbs.csdn.net/topics/391832127