码迷,mamicode.com
首页 > 其他好文 > 详细

pyqt5-自定义信号与槽

时间:2020-10-08 19:41:01      阅读:19      评论:0      收藏:0      [点我收藏+]

标签:关联   处理   sys   main   状态   pyqt5   函数参数   名称   connect   

自动关联的槽函数

pyqt5由ui转化成的py文件中,在setup函数下最后一行为

QtCore.QMetaObject.connectSlotsByName(Form)

这个函数使用了Qt的元对象(QMetaObject),会搜索窗体中的从属组件,将匹配的信号和槽函数关联起来
他假设的槽函数名称是

on_<object name>_<signal name>(<signal parameters>)

这个函数的作用是为自带的一些内建函数编写槽函数,在designer中绑定的信号,如clicked在命名时不需要在函数中进行绑定,如

def on_chkBoxBold_toggled(self,checked): ## "Bold" 复选框
      font=self.ui.textEdit.font()
      font.setBold(checked) #参数 checked 表示勾选状态
      self.ui.textEdit.setFont(font)

按钮chkBOxBold会自动绑定,不需要执行connect。

overload型信号处理

@pyqtSlot修饰符的作用

说明函数的参数类型 ,以使信号和槽正确关联
有一些信号是重载的信号,如clicked()和clicked(bool),在使用带有参数的信号时无法直接自动关联,需要进行指定,因为
默认是自动关联无参数的信号的,此时需要使用@pyqtSlot修饰符,将函数的参数类型声明清楚.
对于非默认的 overload 型信号,槽函数必须使用修饰符@pyqtSlot 声明函数参数类型。如果两种参数
的 overload 型信号都要关联槽函数,那么两个槽函数名必须不同名,且在关联时要做设置.

@pyqtSlot(bool) ##修饰符指定参数类型,用于 overload 型的信号
def on_chkBoxItalic_clicked(self,checked):
      font=self.ui.textEdit.font()
      font.setItalic(checked)
      self.ui.textEdit.setFont(font)

自定义信号与槽

  • 使用PyQt5.QtCore.pyqtSignal()为一个类定义新的信号
  • 定义信号时,类必须是 QObject 类的子类。
  • 信号需定义为类属性,这样定义的信号是未绑定的,在创建类的实例后,pyqt5会自动将类的实例与信号绑定。
    一个绑定的型号有connect(),disconnect(),emit()三个函数

pyqtSignal()的句法是:

pyqtSignal(types[, name[, revision=0[, arguments=[]]]])
自定义信号与槽的演示
## 自定义信号与槽的演示
import sys
from PyQt5.QtCore import QObject, pyqtSlot, pyqtSignal
class Human(QObject):
	## 定义一个带 str 类型参数的信号
	nameChanged = pyqtSignal(str)
	## overload 型信号有两种参数,一种是 int,另一种是 str
	ageChanged = pyqtSignal([int],[str])

	def __init__(self,name=‘Mike‘,age=10,parent=None):
		super().__init__(parent)
		self.setAge(age)
		self.setName(name)

	def setAge(self,age):
		self.__age= age
		self.ageChanged.emit(self.__age) #发射 int 参数信号
		if age<=10:
		      ageInfo="你是 少年"
                elif (10< age <=18):
                      ageInfo="你是 青年"
		else:
		      ageInfo="你成年了"
		self.ageChanged[str].emit(ageInfo) #发射 str 参数信号

	def setName(self,name):
		self.__name = name
		self.nameChanged.emit(self.__name)

class Responsor(QObject):
	@pyqtSlot(int)
	def do_ageChanged_int(self,age):
		print("你的年龄是: "+str(age))

		@pyqtSlot(str)
	def do_ageChanged_str(self,ageInfo):
		print(ageInfo)

	## @pyqtSlot(str)
	def do_nameChanged(self, name):
		print("Hello,"+name)
if __name__ == "__main__": ##测试程序
	print("**创建对象时**")
	boy=Human("Boy",16)
	resp=Responsor()
	boy.nameChanged.connect(resp.do_nameChanged)

	## overload 的信号,两个槽函数不能同名,关联时需要给信号加参数区分
	boy.ageChanged.connect(resp.do_ageChanged_int) #默认参数, int 型
	boy.ageChanged[str].connect(resp.do_ageChanged_str) #str 型参数

	print("\n **建立关联后**")
	boy.setAge(35) #发射两个 ageChanged 信号
	boy.setName("Jack") #发射 nameChanged 信号
	
	boy.ageChanged[str].disconnect(resp.do_ageChanged_str) #断开关联
	print("\n **断开 ageChanged[str]的关联后**")
	boy.setAge(10) #发射两个 ageChanged 信号
Human类

其中ageChanged具有两种类型的overload信号,信号的参数类型可以是int也可以是str。
对于overload型信号,定义时第一个位置的参数是默认参数,不需要注明参数,如

boy.ageChanged.connect(resp.do_ageChanged_int) #默认参数, int 型

在关联非默认参数时,就需注明参数,如

boy.ageChanged[str].connect(resp.do_ageChanged_str) #str 型参数

通过信号的emit()函数发射信号,在类的某个状态发生变化需要通知外部时,发射相应的信号。
如果信号关联了一个槽函数就会执行槽函数,没有关联就不会有任何动作。

Responsor类

定义了三个函数,与Human类实例对象的信号建立关联。
信号ageChanged有两种参数类型,要与两种参数的ageChange建立关联,两个槽函数名称必须不同,所以为

  • do_ageChanged_int
  • do_ageChanged_str

pyqt5-自定义信号与槽

标签:关联   处理   sys   main   状态   pyqt5   函数参数   名称   connect   

原文地址:https://www.cnblogs.com/ApStar/p/13781443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!