标签:关联 处理 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。
说明函数的参数类型 ,以使信号和槽正确关联
有一些信号是重载的信号,如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)
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 信号
其中ageChanged具有两种类型的overload信号,信号的参数类型可以是int也可以是str。
对于overload型信号,定义时第一个位置的参数是默认参数,不需要注明参数,如
boy.ageChanged.connect(resp.do_ageChanged_int) #默认参数, int 型
在关联非默认参数时,就需注明参数,如
boy.ageChanged[str].connect(resp.do_ageChanged_str) #str 型参数
通过信号的emit()函数发射信号,在类的某个状态发生变化需要通知外部时,发射相应的信号。
如果信号关联了一个槽函数就会执行槽函数,没有关联就不会有任何动作。
定义了三个函数,与Human类实例对象的信号建立关联。
信号ageChanged有两种参数类型,要与两种参数的ageChange建立关联,两个槽函数名称必须不同,所以为
标签:关联 处理 sys main 状态 pyqt5 函数参数 名称 connect
原文地址:https://www.cnblogs.com/ApStar/p/13781443.html