今天是我参加【第四届青训营】笔记创作活动的第11天
pyqt自定义信号
一般有关UI的编程都放在主线程,但是在数据请求以及一些比较耗时的操作都放在子线程中进行,不然都在主线程中实现可能会导致UI界面出现不可预料的错误,比如各种卡顿、无响应或者直接报错等问题,主要是引起UI主线程卡顿。
在子线程中获取数据操作后,需要通过主线程进行使用,但是在不同的线程数据应该如何传递呢?这里就可以通过“信号”来解决。
为了满足不同的信息传递需求,我们可以选择自定义信号类。
在pyqt中自定义信号类
from PyQt5.QtCore import QObject,pyqtSignal
from PyQt5 import QtWidgets.QLineEdit
#自定义信号类的类名
class MySignals(QObject):
#更新输入框的信号
text_up = pyqtSignal(QtWidgets.QLineEdit,str)
自定义信号类需要继承QObject类,定义信号的时候需要用到“pyqtSignal”,“text_up”是自定义的信号,这个信号通过“pyqtSignal”类创建来的,这里在创建的时候加入了两个参数,第一个参数“QtWidgets.QLineEdit”为pyqt中的单行输入框类,第二个参数“str”为普通的字符串类,参数的类型为类,参数可以根据自己的需求来确定。定义了信号类我们就能使用了。
信号的使用
mySignal = MySignals()
...
#信号的响应
mySignal.text_up.connect(self.uptext)
...
#信号具体的处理事件,定义在主线程中
def uptext(self,lineEdit,message):
#对单行输入框设置传递的字符串
lineEdit.setText(s)
...
#在子线程中使用信号传递数据
mySignal.text_up.emit(self.lineEdit,"在子线程中获取到的数据")
在信号的具体处理方法中,参数类型、数量和顺序需要与自定义的信号一致。子线程中使用信号传递数据也需要使用相同的格式。
信号在这里的最主要的功能就是需要将UI操作放在主线程进行。
标题:后台线程 与 信号 | 白月黑羽