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

简介:   本文主要介绍在PySide中如何使用信号和槽。传统的使用方式已经在参考文档里给出,我们的重点是解释如何使用新的代码风格来操作信号、槽。  PyQt中使用信号、槽的新代码风格是在PyQt v4.5中介绍的,这个风格的主要目的是为Python程序员们提供一个符合Python风格的方式。

  本文主要介绍在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/bi上海闵行企业网站设计与制作n/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 上海徐汇企业网站制作tyle="color: #000000;"> 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 上海徐汇企业网站设计与制作="color: #000000;">= 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
目录
相关文章
|
3月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
5月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
143 0
|
6月前
|
机器学习/深度学习 算法 数据可视化
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
|
机器学习/深度学习 数据采集 存储
【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
263 0
.Net Micro Framework研究—Digi开发板初探
写的比较基础全面,由于我们北航的研发团队先研究了Digi的开发板,所以直到今天Digi开发板才到我的手上,我的《Micro Framework研究》系列文章以后也会陆续推出
738 0
.Net Micro Framework研究—IO读写
试验平台:Digi MF开发板
466 0
.Net Micro Framework研究—串口操作
试验平台:Digi MF开发板,Digi提供的示例中包含了串口的示例程序
581 0
|
网络协议
.Net Micro Framework研究—TCP/IP通信
关于网络通信方面,Digi提供了两个程序,一个是TCP Server运行在Digi的开发板上,一个是TCP Client程序,运行在PC上,通过网络,上位机很容易控制Digi开发的IO信号
672 0
.Net Micro Framework研究—模拟器改造
由于Digi提供的开发板没有LCD显示屏,所以有关绘图方面的操作,只好在模拟器上进行了。
564 0
下一篇
无影云桌面