python pyqt5 qthread有哪些方法

python pyqt5 qthread有哪些方法,第1张

用例子说明吧,常用的不多

PyQt中的线程类 QtCoreQThread ,使用时继承QThread类

启动界面的线程暂称为UI线程。界面执行命令时都在自己的UI线程中。

如果在UI线程中执行网络连接和数据库 *** 作等耗时的 *** 作,界面会被卡住,Windows下有可能会出现“无响应”的警告。

阻塞UI线程会降低用户体验和应用稳定性。因此我们可以把耗时 *** 作放在线程中去执行。

QThread代表一个线程,我们可以复写run函数来执行我们要的 *** 作。

QThread可以使用 QtCorepyqtSignal 来与界面交互和传输数据。

PyQt4 QThread 代码示例

•Python27

# -- coding: utf-8 --

import sys

from PyQt4 import QtCore

from PyQt4QtCore import QCoreApplication

from PyQt4QtGui import QWidget, QPushButton, QApplication, QTextBrowser

class TimeThread(QtCoreQThread):

signal_time = QtCorepyqtSignal(str, int) # 信号

def __init__(self, parent=None):

super(TimeThread, self)__init__(parent)

selfworking = True

selfnum = 0

def start_timer(self):

selfnum = 0

selfstart()

def run(self):

while selfworking:

print "Working", selfthread()

selfsignal_timeemit("Running time:", selfnum) # 发送信号

selfnum += 1

selfsleep(1)

class TimeDialog(QWidget):

def __init__(self):

super(TimeDialog, self)__init__()

selftimer_tv = QTextBrowser(self)

selfinit_ui()

selftimer_t = TimeThread()

selftimer_tsignal_timeconnect(selfupdate_timer_tv)

def init_ui(self):

selfresize(300, 200)

selfsetWindowTitle('TimeDialog')

selftimer_tvsetText("Wait")

selftimer_tvsetGeometry(QtCoreQRect(10, 145, 198, 26))

selftimer_tvmove(0, 15)

btn1 = QPushButton('Quit', self)

btn1setToolTip('Click to quit')

btn1resize(btn1sizeHint())

btn1move(200, 150)

btn1clickedconnect(QCoreApplicationinstance()quit)

start_btn = QPushButton('Start', self)

start_btnsetToolTip("Click to start")

start_btnmove(50, 150)

selfconnect(start_btn, QtCoreSIGNAL("clicked()"), selfclick_start_btn)

def click_start_btn(self):

selftimer_tstart_timer()

def update_timer_tv(self, text, number):

selftimer_tvsetText(selftr(text + " " + str(number)))

if __name__ == '__main__':

app = QApplication(sysargv)

time_dialog = TimeDialog()

time_dialogshow()

sysexit(appexec_())

QThread中使用的信号 signal_time = QtCorepyqtSignal(str, int) 指定了参数str和int

发送信号 selfsignal_timeemit("Running time:", selfnum)

外部接收信号 selftimer_tsignal_timeconnect(selfupdate_timer_tv)

信号连接到方法 update_timer_tv(self, text, number) ,注意信号与方法的参数要一一对应

使用中我们可以定义多种不同的信号 QtCorepyqtSignal

启动线程,调用 start()

一、Pyqt5

创建第一个窗体

很多人写窗体程序都是直接敲代码,不使用设计器,我个人不是很赞成这种做法。使用设计器的好处是直观、维护方便,尤其开发复杂窗体的效率高。

但是每次修改ui文件后,需要重新生成py文件,会将原来的内容覆盖掉,为了避免这种情况,引入了一个中间类。主要步骤如下:

1使用QtDesigner创建一个简单的对话框,保存成simpleDialogui。

2使用cmd,进入simpleDialogui文件所在的目录,运行命令pyuic5

simpleDialogui

>ui_simpleDialogpy

3打开ui_simpleDialogpy,pyqt自动生成的代码如下(无需任何修改):

from

PyQt5

import

QtCore,

QtGui,

QtWidgets

class

Ui_Form(object):#注意pyqt5窗体从object继承,不是QMainWindow了

def

setupUi(self,

Form):

FormsetObjectName("Form")

Formresize(400,

300)

selfpushButton

=

QtWidgetsQPushButton(Form)

selfpushButtonsetGeometry(QtCoreQRect(60,

70,

241,

131))

selfpushButtonsetObjectName("pushButton")

selfretranslateUi(Form)

selfpushButtonclickedconnect(Formclose)

QtCoreQMetaObjectconnectSlotsByName(Form)

def

retranslateUi(self,

Form):

_translate

=

QtCoreQCoreApplicationtranslate

FormsetWindowTitle(_translate("Form",

"Form"))

selfpushButtonsetText(_translate("Form",

"PushButton"))

可以看到刚才新建的对话框的类名称是”Ui_Form”。

4新建一个simpleDialogpy文件,编写代码如下:

from

PyQt5

import

QtCore,

QtGui,

QtWidgets

from

ui_simpledialog

import

Ui_Form

import

sys

class

SimpleDialogForm(Ui_Form):#从自动生成的界面类继承

def

__init__(self,

parent

=

None):

super(SimpleDialogForm,

self)__init__()

def

yourFunctions(self):

Pass

 

#这个类中处理你自己的业务逻辑。界面ui可随心所欲的修改,不影响你已经编写的逻辑。

自定义一个类(SimpleDialogForm)继承自pyqt自动生成的类,然后覆写”构造函数”,剩余的工作就是你自己想要添加的功能了。

5完善运行测试代码,如下:

if

__name__

==

"__main__":

app

=

QtWidgetsQApplication(sysargv)

main

=

QtWidgetsQMainWindow()#创建一个主窗体(必须要有一个主窗体)

content

=

SimpleDialogForm()#创建对话框

contentsetupUi(main)#将对话框依附于主窗体

mainshow()#主窗体显示

sysexit(appexec_())

6为什么要这么做?

基于界面与实现分离的原则,我们使用QtDesigner设计的窗体,仅仅作为界面使用,具体业务逻辑通过单独的文件实现,这样以后如果界面发生变动,pyqt自动生成窗体代码时不会覆盖掉我们已经编写的业务逻辑。

7推荐的做法:

为了有良好的封装性,将中间类修改为:

class

SimpleDialogForm(Ui_Form,

QtWidgetsQMainWindow):

def

__init__(self,

parent

=

None):

super(SimpleDialogForm,

self)__init__()

selfsetupUi(self)#在此设置界面

#在此,可添加自定义的信号绑定

selfpushButtonclickedconnect(selfopenFile)

selfpushButton_2clickedconnect(selfcloseApp)

测试代码这样写:

if

__name__

==

"__main__":

app

=

QtWidgetsQApplication(sysargv)

main

=

SimpleDialogForm()

mainshow()#在外面只需要调用simpleDialogForm显示就行,不需要关注内部如何实现了。

sysexit(appexec_())

'''

简介

PyQT5中 QTimer例子

'''

import sys

from PyQt5QtCore import

from PyQt5QtGui import

from PyQt5QtWidgets import

global sec

sec = 0

class WorkThread(QThread):

trigger = pyqtSignal()

def countTime():

global sec

sec += 1

# LED显示数字+1

lcdNumberdisplay(sec)

def work():

# 计时器每秒计数

timerstart(1000)

# 计时开始

workThreadstart()

# 当获得循环完毕的信号时,停止计数

workThreadtriggerconnect(timeStop)

def timeStop():

timerstop()

print("运行结束用时", lcdNumbervalue())

global sec

sec = 0

if name == " main ":

app = QApplication(sysargv)

top = QWidget()

topresize(300, 120)

'''

简介

PyQT5中 QThread 例子

'''

from PyQt5QtCore import

from PyQt5QtGui import

from PyQt5QtWidgets import

import sys

class MainWidget(QWidget):

def init (self, parent=None):

super(MainWidget, self) init (parent)

selfsetWindowTitle("QThread 例子")

selfthread = Worker()

selflistFile = QListWidget()

selfbtnStart = QPushButton('开始')

layout = QGridLayout(self)

layoutaddWidget(selflistFile, 0, 0, 1, 2)

layoutaddWidget(selfbtnStart, 1, 1)

selfbtnStartclickedconnect(selfslotStart)

selfthreadsinOutconnect(selfslotAdd)

class Worker(QThread):

sinOut = pyqtSignal(str)

if name == " main ":

app = QApplication(sysargv)

demo = MainWidget()

demoshow()

sysexit(appexec_())

qt是一个C++开发的库,跨平台的开发库。

qtcreator是qt的开发工具,叫IDE也行。用来方便开发基于qt库的程序。如果不用qtcreator你完全可以用记事本来开发基于qt的程序,qtcreator更方便而已。

qtsdk应该和qt是一个意思。

pyqt是用于python的库,在python中调用qt库来实现图形界面程序开发。

安装pyqt5 和 pyqt5-tools 就不详细介绍了

两个国内源的 

pip install pyqt5 -i >

以上就是关于python pyqt5 qthread有哪些方法全部的内容,包括:python pyqt5 qthread有哪些方法、pyqt qwiget怎样启动另一个窗体、python pyqt5 QThread等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10145351.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存