zoukankan      html  css  js  c++  java
  • pyqt

    使用PyQt线程的正确姿势

    用了Python一段时间了,图形编程看了一些,还是觉得PyQt比较方便,主要得益于designer和uic两个工具,使得前端页面可视编程,也方便转换为代码。关于这两个工具的使用网上一大堆,我觉得并没有必要重复,只有有一点要提醒大家注意,就是用uic生成的程序文件千万别动!!!新写一个类继承它,需要增加的方法都放在子类里面,这样我们重新修改ui文件,再用uic生成代码的时候就不用再修改太多(如果不修改已有的控件名就不用修改)。

    说到图形界面,就避开不了线程,毕竟UI主线程必须保证事件循环不被阻塞来响应用户的输入。一开始使用PyQt的时候,程序动不动就未响应,后来才知道是因为把需要长时间运行的代码放在了主线程,阻塞了事件循环。这时候,我们便需要把这部分代码移到其他线程,通过信号与槽来实现线程间的通信。所谓线程,按照我目前的理解,是包含了自己的事件循环机制,所谓事件循环,也就是说当线程接收到信号的时候,如果有响应的槽,可以做出响应。同时,线程还可以发送信号给其他线程,信号可以带参数。

    由于写博客的时间有点仓储,本博客里面的代码全部是截取我最近的项目里面的代码,但跟博客内容有关的部分我会尽量呈现和说明清楚,望见谅。

    QtCore.QThread是一个管理线程的类,当我们使用其构造函数的时候,便新建了一个线程。这里要强调,QThread是一个线程管理器,不要把业务逻辑放在这个类里面,Qt的作者已经多次批评继承QThread类来实现业务逻辑的做法。那么,我们怎样把代码放到Thread中运行呢?答案如下:

    self.writing_thread = QtCore.QThread()
    self.writer.moveToThread(self.writing_thread)
    我们把业务逻辑写在一个QtCore.QObject的子类里面,然后新建一个实例,例如上述代码的writer,然后调用继承了父类的方法moveToThread,这样就可以把该对象放在线程里面。剩下的工作就是通过信号和槽的机制处理业务逻辑和返回结果了。一般来说,槽函数所在的类在哪个线程,这个函数就在哪个线程执行。

    https://blog.csdn.net/qq_39607437/article/details/79213717

    pyqt多线程moveToThread的使用

    创建一个QObject子类
    该类包含要在子线程中运行的代码,以及在子线程运行过程中需要发回主线程的信号。以下为例:
    
    class AnalyzObject(QObject):
        def __init__(self,parent=None):
            super(AnalyzObject,self).__init__(parent)
        #开始调用网络的信号
        stop_analyz_signal=pyqtSignal()
        start_print_result=pyqtSignal()
    	
        def analyz_work(self):
            test_video()
            self.start_print_result.emit()		
            self.stop_analyz_signal.emit()
    
    其中,analyz_work是要子线程中所要运行的代码。
    
    实例化QObject子类,并转移到子线程中。
    回到主线程,先将AnalyzObject(本例中)实例化,再新创建一个子线程,将实例化的AnalyzObject转移到子线程中,以下为代码:
    self.analyz_thread=QThread()
    self.analyze=AnalyzObject()
    self.analyze.moveToThread(self.analyz_thread)
    		
    开始线程
    在希望激活子线程的时候加入代码:
    self.analyz_thread.started.connect(self.analyze.analyz_work)
    self.analyz_thread.start()
    结束线程
    self.analyze.stop_analyz_signal.connect(self.stop_analyze)
    def stop_analyze(self):
        self.analyz_thread.quit()
    
    
  • 相关阅读:
    OpenCASCADE 平面与球面求交
    OpenCASCADE 平面求交
    为 Taro 的小程序 TS 模板加点料
    async-validator 的中文文档翻译
    JS中的与冒号的作用、箭头函数相关的一道题
    为Electron 安装 vue-devtool等扩展
    小程序做一个能够左右滑动切换的多tab页面
    使用sourceMap文件定位小程序错误信息
    手写一个promise
    通过页面预加载(preload)提升小程序的响应速度
  • 原文地址:https://www.cnblogs.com/plusUltra/p/11384989.html
Copyright © 2011-2022 走看看