写在前面
PyQt5 和 PySide2 的区别
他们背后原理的差别我就不细说了(我也不知道),你只要记住使用上基本差不多就行,网上搜索他们用法的时候,以哪个为关键词搜索都行吧,官网 给出了他们的差异,聚焦我们要讲的问题,在信号与槽机制和多线程机制上,他们的差别如下:
# PyQt5 引入线程类和信号
from PyQt5.QtCore import QThread, pyqtSignal
# PySide2 引入线程类和信号
from PySide2.QtCore import QThread, Signal # 注意区别就在于这里的信号是 Signal,和 PyQt5 不一样,而线程类是一样的
信号与槽
信号是一个载体,装着自定义类型的数据(例如下面的object),将数据传送到绑定(connect)的函数(连接槽)中(数据作为参数传入函数)
信号与槽的基本框架如下:
signal = pyqtSignal(object) # 自定义信号传送的数据类型为 object
signal.emit(object) # 发射信号 object,每发射一次,连接槽函数就执行一次
signal.connect(custom_function) # 信号绑定的连接槽函数
# 自定义的连接槽函数,传入的参数就是信号
def custom_function(object):
pass
线程类
线程类用于实现函数并行执行,假如我在动态的画函数曲线的同时想显示已经画了多长时间,这个情况在串行下就不好实现,因为要等到函数曲线画完才能开始执行下面的函数,就不能实现同步了。
而且 PyQt5/PySide2 不支持 python 的多线程类 threading,会报错 QObject: Cannot create children for a parent that is in a different thread. 。
线程类的基本框架如下:
class NewThread(QThread):
signal = pyqtSignal(object) # 自定义信号,其中 object 为信号承载数据的类型
def __init__(self, parent=None):
super().__init__()
self.x = 0 # 线程中自定义变量
# 线程内可自定义其他函数
def custom_function(self):
pass
# new_thread = NewThread()
# 通过 new_thread.start() 调用此 run() 函数
def run(self):
self.custon_function()
self.signal.emit(self.x) # 发射信号
new_thread = NewThread()
new_thread.start() # 为线程分配资源,让它执行
# 下面两个都是停止执行,但我一般用第二个
new_thread.wait()
new_thread.terminate()

本文深入解析PyQt5和PySide2在多线程处理、信号与槽机制上的应用与区别,通过具体示例展示如何使用线程类、信号与槽以及定时器进行GUI应用程序的开发。

5711

被折叠的 条评论
为什么被折叠?



