使用PyQt4编写界面后台程序的方法总结

一、怎么建立多线程

  界面程序如果有稍微耗时一点的任务如果不使用多线程就会界面卡死,所以大多数情况会使用到多线程。PyQt4自己有多线程的机制,可以派生多线程类然后生成多线程实例。代码如下:

 form PyQt4.QtCore import *

 class MyThread(QThread):
def __init__(self,func,args):
super(MyThread,self).__init__()
self.func = func
self.args = args def run(self):
self.func(self,args)

  在创建线程时,只要向MyThread实例传参,参数内容为实际要调用的耗时函数及其参数就可以了,如下:

class Ui():
self.thread1 = MyThread(func,args)
self.thread1.start() #此处开始自动调用线程的run函数

PS:在一个程序中只有一个主线程,在界面程序中该主线程就是界面所在的线程,其他产生的线程都是子线程;子线程创建后执行任务,当任务执行完后会自动消亡,所以可以对每个耗时的任务分别设置一个新的线程是没有问题的

二、如何在界面中打印日志

  此处我分为了两种情况,第一种是需要使用线程的耗时任务的日志,第二种是不需要使用线程的任务的日志。

1、使用线程调用任务函数

    这种情况下,在线程类中创建信号并将其作为参数传给任务函数,在主界面类中connect,代码如下:

 form PyQt4.QtCore import *

 class MyThread(QThread):
sendlog = pyqtSignal(str)
def __init__(self,func,args,s):
super(MyThread,self).__init__()
self.func = func
self.args = args
self.s = s
def run(self):
self.sendlog.connect(self.s)
self.func(self,args,self.sendlog)

     在被线程调用的func中接收signal,然后有log要显示时用signal.emit(log),其中需将log变为unicode字符否则界面显示中文会有乱码

其中self.s为主界面向控件输入日志的控件,即接收信号的函数,在线程中做connect可以避免在主线程中每次创建一个新线程都需要connect一次

  2、不使用线程

     在任务类中建立与上面相同的信号,在主界面中进行connect。此处有一个问题需注意,如果创建信号的类不是派生类就会报错,我是让类随便继承了一个类QFile后问题就没有了

三、关于信号的定义及引用

    信号需要定义在类的初始化函数外,且为类属性,不能是实例属性,即定义时信号名前面没有self

    引用signal时必须用类的实例,因为用实例引用时pyqt就会自动把信号同实例绑定即产生一个绑定的信号,绑定的信号才有connect()、emit()等方法,类直接引用信号尝试connect时,会有编译错误:                                       AttributeError:"PyQt4.QtCore.pyqtSignal" object has no attribute "connect"

最新文章

  1. 基于2D-RNN的鲁棒行人跟踪
  2. linux 下载百度盘,迅雷离线文件,解压乱码文件的方法。
  3. [codeforces 339]E. Three Swaps
  4. Run python as a daemon process
  5. Writing the first draft of your science paper — some dos and don’ts
  6. Silverlight中DataPager控件扩展
  7. poj2594
  8. Postman 基本操作学习
  9. jquery中的replaceWith()和html()有什么区别?
  10. go: GOPATH entry is relative; must be absolute path: "".
  11. swiper拖拽之后不自动滑动问题
  12. 用cmd命令创建oracle 数据库、用户和表空间
  13. 关于webService发布的wsdl中的import问题解决
  14. Docker安装及基本操作
  15. 查看服务器运行多少个ASP.NET Core程序
  16. Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)
  17. Daily Scrum 12-25
  18. 记录下ABAP开发的一些东西(T-code居多)Updated to markdown
  19. 第31章:MongoDB-索引--复合索引
  20. Razor 中的@rendersection

热门文章

  1. buffer busy wait
  2. BZOJ3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆
  3. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)
  4. HDOJ 1326 Box of Bricks(简单题)
  5. HDOJ 1058 Humble Numbers(打表过)
  6. C#中string类型是什么类型
  7. Java多线程中变量的可见性
  8. jq指定行切换
  9. (转)Linux下Apache 限速模块安装笔记
  10. linux自己主动重新启动tomcat脚本