品牌型号:联想拯救者R7000
系统:Windows 10专业版
软件版本:PyQt 5.15.11
我们在使用PyQt开发桌面应用时,需要做事件处理与线程间通信,多线程通信可以加速系统运行,提升用户体验。事件处理更加重要,按钮点击、文本输入都需要做事件处理,然后才能做功能处理。本文将为大家介绍PyQt如何处理事件,PyQt如何实现线程间通信的相关内容。
一、PyQt如何处理事件
在实际工作中,常见的事件包括用户交互事件,例如按钮点击、鼠标移动、键盘输入等,系统事件,例如窗口大小改变、关闭以及自定义事件,例如业务逻辑触发的自定义通知,下面我就为大家介绍一下PyQt处理事件的方式。
1、信号与槽机制
在大多数基础交互场景,都是使用这种事件处理方式,例如在开发登录窗口时,用户点击【登录】按钮后,需要验证账号密码是否正确,就可以通过绑定按钮的clicked信号与自定义槽函数实现。代码层面,只需通过button.clicked.connect(self.check_login)将信号与槽关联,当用户点击按钮时,就会触发该事件,并将该信号分发到对应的槽函数,执行验证逻辑,代码案例可以参考下文。

2、重写事件处理函数
比如在开发文本编辑器时,需要监听键盘按下事件,实现【回车触发提交】的功能,就需要重写QWidget的keyPressEvent函数,判断按下的键是否为回车键,如果是指定按键,就执行提交逻辑。另外,窗口关闭事件【closeEvent】也是工作中经常需要处理的,比如用户关闭窗口时,提示【是否保存未提交的数据】,通过重写closeEvent函数,添加弹窗确认逻辑,代码案例可以参考下文。

3、事件过滤机制
在需要统一管理多个控件事件的场景,比如开发数据展示窗口时,多个输入框需要限制输入内容,如果给每个输入框单独绑定事件,会造成代码重复冗余。这种情况我们可以通过【installEventFilter】为所有输入框安装事件过滤器,在【eventFilter】函数中拦截键盘输入事件,判断输入内容是否符合要求,不符合就拦截该事件,统一管理。

在工作中需要注意,事件处理需要避免阻塞事件循环,比如在槽函数中执行读取大文件等耗时操作,会导致界面卡顿,此时需要结合多线程进行处理,这也引出了线程间通信的需求。
二、PyQt如何实现线程间通信
在PyQt开发中,主线程负责处理界面渲染与用户交互事件,如果将网络请求、数据解析、处理文件等耗时的操作放在主线程中,可能会导致界面无响应,严重影响用户体验。所以就需要将耗时操作放入子线程执行,这就需要线程间通信,下面我就为大家介绍一下PyQt实现线程间通信的方式。
1、信号与槽机制
该方式不仅用于处理事件,还支持跨线程安全通信,并且适用绝大多数场景。例如开发数据爬取工具时,主线程负责显示爬取进度,子线程负责执行爬取逻辑,子线程需实时将爬取进度传递给主线程更新界面。此时可在子线程中定义自定义信号,例如下图中【progress_signal = pyqtSignal(int)】,在爬取过程中通过【self.progress_signal.emit()】发射进度信号,主线程中绑定该信号与更新进度条的槽函数。

2、QQueue队列
该方式适用于子线程与主线程之间批量通信的场景,比如开发文件解析工具时,子线程解析多个文件后,将解析结果传递给主线程进行展示。此时就可以通过创建QQueue对象作为数据“中转站”,子线程解析完一个文件就将结果存入队列,主线程通过定时器定时读取队列中的数据,以此实现线程间通信。

三、总结
以上就是PyQt如何处理事件,PyQt如何实现线程间通信的相关内容。事件处理可以通过信号与槽、事件重写、事件过滤三种方式,足以满足日常使用场景。线程间通信可以通过信号与槽、QQueue队列,来实现主线程与子线程的数据传递,希望本文对你有所帮助。