
用例子说明吧,常用的不多
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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)