范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Qt开发线程类QThread

  本文主要介绍Qt中线程类QThread的用法
  在这篇文章中,将写一个获取热点新闻的程序,每隔2秒发送一个关键字,从服务器获得与该关键字相关的一条热点新闻。
  我们的目标是实现以下几个功能:用户在输入框中输入n个关键字,以英文的逗号, 隔开用一个搜索结果列表来呈现所获得的新闻标题使用进度条更新已获得的新闻数目用户随时可以停止获取数据
  界面设计如下图:
  上面是一个关键字输入框QLineEdit,中间使用QListWidget呈现获得的数据,下面是QProgressBar更新进度,最下面有一个停止按钮和一个开始按钮。一、代码片段1.新闻获取部分
  我们使用接口,从服务器获取数据。import json import time import requests   agent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.8 Safari/537.36" headers = {     "User-Agent": agent }   def get_top_post(subreddit):     #从服务器获取数据     url = "https://www.reddit.com/r/{}.json?limit=1".format(subreddit)     try:         restext = requests.get(url, headers=headers)         data = json.loads(restext.text)         top_post = data["data"]["children"][0]["data"]     except Exception as e:         print(e)         return "错误数据"     return ""{title}" by {author} in {subreddit}".format(**top_post)   def get_top_from_subreddits(subreddits):     for subreddit in subreddits:         yield get_top_post(subreddit)         time.sleep(2)   if __name__ == "__main__":     for post in get_top_from_subreddits(["python", "php", "learnpython"]):         print(post)#输出结果
  上面是获取并处理新闻数据的程序。需要注意的是其中 time.sleep(2) ,之所以每次发送请求要隔两秒,是因为服务器出于性能考虑,只允许每2秒发送一次请求,否则可能会得到错误的数据。在这里有3个关键字,python、php、learnpython,所以整个过程持续了大约6秒。
  不必在意其中实现的细节,因为本文的重点是线程,而不是获取数据。
  【领更多QT 学习资料,点击下方链接免费领取↓↓ ,先码住不迷路~】
  点击领取→Qt学习资料~2.基本界面
  我们可以在代码中实现所有控件和布局;也可以用Qt Designer设计好,然后使用命令 pyuic5 -o yourui.py yourui.ui 生成界面代码。
  在这里,我用的是第一个方法:def initUI(self):   self.setWindowTitle("QThread Study")       keywordLbl = QLabel("关键字(以逗号,隔开):")     self.keywordEdit = QLineEdit()     hrLayout = QHBoxLayout()     hrLayout.addWidget(keywordLbl)     hrLayout.addWidget(self.keywordEdit)       resultLbl = QLabel("搜索结果:")     self.resultList = QListWidget()     vrLayout = QVBoxLayout()     vrLayout.addWidget(resultLbl)     vrLayout.addWidget(self.resultList)       self.searchProgBar = QProgressBar()     self.searchProgBar.setValue(0)     self.stopBtn = QPushButton("停止")     self.stopBtn.setEnabled(False)     self.startBtn = QPushButton("开始")     hrLayout1 = QHBoxLayout()     hrLayout1.addWidget(self.stopBtn)     hrLayout1.addWidget(self.startBtn)       vrLayout1 = QVBoxLayout(self)     vrLayout1.addLayout(hrLayout)     vrLayout1.addLayout(vrLayout)     vrLayout1.addWidget(self.searchProgBar)     vrLayout1.addLayout(hrLayout1)二、未使用多线程
  如果没有使用多线程,你可能会这么做:写好新闻获取的代码、写好界面代码,接下来简单地调用函数处理数据。这么做可以,但所有工作都在单独的GUI线程中完成,所以执行函数获取新闻时,你的程序将会被"冻结"住。
  就像这样:
  主线程被锁住直到程序执行结束,搜索结果列表才会更新输入框以及其它界面中的元素都无法使用一旦函数开始执行,就没法停止获取数据
  下面是主要代码(点击开始按钮 - 进入槽函数 - 获取新闻数据):class ThreadTestUI(QWidget):     def __init__(self, parent = None):         super().__init__(parent)         self.initUI()         #建立信号槽连接         self.startBtn.clicked.connect(self.startBtnClicked)       def startBtnClicked(self):         subreddit_list = str(self.keywordEdit.text()).split(",")         if subreddit_list == [""]:             print("没有搜索内容")             return         self.resultList.clear()         for post in self.get_top_from_subreddits(subreddit_list):             self.resultList.addItem(post)三、使用多线程
  没有使用多线程将导致程序卡住,体验很差,下面将使用QThread类重写我们的代码。
  首先要做的就是写一个线程,这个线程与之前新闻获取部分 get_top_post  和 get_top_from_subreddits  做相同的事,每当获得新数据就立即更新界面,而且允许用户点击"停止"按钮停止获取数据。1.QThread的基本结构
  QThread类很简单,它的整体结构如下:from PyQt4.QtCore import QThread   class YourThreadName(QThread):       def __init__(self):         QThread.__init__(self)       def __del__(self):         self.wait()       def run(self):         # your logic here
  你可以通过给构造方法 __init__  添加参数,将数据传给线程。
  在 run  方法中处理你的数据。
  注意不能直接调用run方法,而是通过 start  方法间接调用它,否则界面仍有可能被"冻结"住。
  接下来是使用上面你定义的线程: self.myThread = YourThreadName() self.myThread.start()
  如此,在run方法中写的代码得以执行,可以使用像isRunning这样的方法检测线程是否正在运行。
  你可能会经常用到这些QThread的方法: quit  、 start  、 terminate  、 isFinished  、 isRunning  。
  还有QThread的这些信号: finished  、 started  、 terminated  。2.我们的程序
  介绍完QThread类,下面回到我们的新闻获取程序。
  我们可以很容易地将获取新闻的代码移到QThread类,除了修改run方法,其它地方基本保持原样。
  另一个小的变化是,需要将新闻关键字的列表传到线程类中,从而在run方法中使用这些关键字。def setSubReddit(self, subReddit):     self.subreddits = subReddit   def run(self):     for subreddit in self.subreddits:         top_post = self._get_top_post(subreddit)         self.sleep(2)
  _get_top_post  方法是从之前的新闻获取代码直接复制过来的,在run方法中遍历之前设置的关键字subreddits。
  主界面类:self.testThread.setSubReddit(subreddit_list) self.testThread.start()
  OK,程序将在单独的线程中运行,然后根据关键字获取所有热点新闻。
  但是,界面中的元素还没有得到更新,没有反馈给用户,所以我们还需做些什么。
  当然,不能简单地在线程类中这么写: self.searchProgBar.setValue(int)  ,因为它指向QThread对象,而不是UI对象。
  在数据处理线程和UI线程之间沟通的正确方法是使用"信号"。四、信号
  数据获取线程在背后运行,主界面线程需要获得数据(比如新闻标题),从而更新界面元素(比如进度条和新闻列表)
  下面先讲一下Pyqt的信号,它与C++中信号槽连接有所不同。1.内建信号
  获取数据结束之后需要通知用户,我们将使用一个所有QThread实例都有的信号。
  首先写一个线程结束后我们想要执行的代码,比如打印一条信息,我们在主界面类中这么写:def threadFinished(self):     print("获取结束")
  接下来是信号的连接,将QThread实例发出的信号与我们线程结束后打印信息的函数连接起来:self.testThread = GetPostThread()
  self.testThread.finished.connect(self.threadFinished)
  内建信号与槽函数的连接很直接,自定义信号与之唯一的不同就是,我们首先需要在QThread类中定义一个信号,在主线程中的写法是一样的。
  所以接下来——2.自定义信号
  想要像内建信号一样使用自定义信号,首先需要定义它们,在QThread类中定义信号:postSignal = pyqtSignal(str)
  注意:定义的信号有一个参数,类型是字符串str。
  run方法中处理并获得数据,然后通过信号将其发出:def run(self):     for subreddit in self.subreddits:         top_post = self._get_top_post(subreddit)         self.postSignal.emit(top_post)         self.sleep(2)
  主线程获得信号,并将它与信号处理函数(槽函数)相连接:self.testThread.postSignal.connect(self.getPostSlot)
  信号发出时带有一个字符串参数(在这里是新闻的标题),定义信号处理函数时也设置一个额外的参数,获得传来的字符串:def getPostSlot(self, top_post): self.resultList.addItem(top_post) self.searchProgBar.setValue(self.searchProgBar.value() + 1)
  将获得的新闻标题呈现在列表中,并调整进度条的数值。
  【领更多QT 学习资料,点击下方链接免费领取↓↓ ,先码住不迷路~】
  点击领取→QT+音视频开发学习资料~五、总结
  到此为止,我们已经完成所有工作:从新闻网站获取新闻的线程线程与主线程的连接如何实现自定义信号如何使用内建信号注意:在QThread线程类中处理数据,通过信号将数据发送到主界面线程,进而更新界面元素
  看一下现在界面是怎么样的吧:
  你将看到:每获得一条新数据,界面立即更新界面仍然可响应,比如拖动、改变输入框内容主线程没有被锁住随时可以点击停止按钮,停止获取数据

TES淘汰后,破防的小天粉吐槽他恋情忙着恋爱还找letme前女友?引子TES输比赛后,s12的旅程也宣布告一段落了。这一次,JackeyLovemark两位选手全部泪洒采访舞台,tian也有点哽咽,看来,输比赛对选手的心态有很大影响,他们也不想离黄子韬徐艺洋吃韩餐,只是谈恋爱又不是非要结婚,不公开怎么了?黄子韬和徐艺洋之前就是绯闻满天飞,如今又被狗仔拍到共同出游,全世界都知道了他们的恋情,而他们却不想承认这一点。黄子韬吃饭被拍,也被无数网友讨论,掀起了极大的热度,评论也是两极分化,中国女排黄金队员杨昊,经历马拉松式恋爱长跑,好事多磨心想事成上世纪80年代,中国女排得五连冠给中国人民留下了深刻的印象而从2001年到2004年,中国女排又在陈忠和的率领下连续拿到了世界杯奥运会冠军,这样重现辉煌的中国女排,被称之为黄金一代风湿病有哪些饮食禁忌?风湿病是长期性病情不能够得到痊愈的疾病,发作时会出现关节僵硬疼痛等症状,风湿病症状缓慢时会给患者的生活带来一定的困难,急性发作时患者只能卧床休养,这时候身体的免疫能力快速降低,很需负债70亿,宣布破产,首个死在新能源浪潮下的传统车企任何一个行业在发展的过程中都需要跟随时代的变化进行革新,正如汽车行业一样,传统的汽车行业经过了百年的发展时间,目前就迎来了一个巨大的转折期,新能源汽车成为了趋势所在。说到新能源行业小米又有黑科技?颠覆传统家电,透明蒸汽电饭煲蒸煮过程全程可视小米又出黑科技了,颠覆传统电饭煲加热方式,改用蒸汽煮饭做汤,更重要的是采用透明设计,让我们能看到食物煮熟的全过程,但是这种创新是真好用还是智商税,还是需要好好来研究一下,避免踩坑。市场暖风拂面!各方资金真金白银积极入场点蓝字关注,不迷路近期,基金等机构自购旗下产品的消息接二连三,上市公司及其股东回购增持的消息也不绝于耳。多路资金宣告拟投入真金白银入场,表明看好中国资本市场长期稳定健康发展。此外,美股两连涨!道指涨1。12上新苹果跳水回升涨0。94中新经纬10月19日电美股三大股指周二集体收涨,为连续第二个交易日集体上涨。三大股指早盘高开回落,在近乎抹平涨幅后小幅反弹。有消息称苹果将削减iPhone14Plus产量,苹果股价看图学习十年画卷丨推进一国两制事业行稳致远一国两制是中国的基本国策。党的十八大以来,以习近平同志为核心的党中央坚持全面准确坚定不移贯彻一国两制方针,坚持和完善一国两制体系,坚持依法治港治澳,维护宪法和基本法确定的特别行政区童装业务,运动品牌的吸金密码361度安踏体育等业绩再增长,布局童装能成为各品牌业绩增长密码吗?10月18日,多运动品牌发布三季度运营数据,其中,361度主品牌获双位数增长特步主品牌增长2025,安踏体育获得正折叠屏手机诞生4年了赛道火热,为何用的人不多?千篇一律的手机外形令用户产生视觉疲劳,而一块可以折叠起来的屏幕,不仅给用户带来更多个性化选择,也为正在寻找新市场爆发点的手机厂商提供了一个思路。自2018年10月柔宇科技发布全球首
春节临近,化肥市场交投基本停滞!1月18日最新化肥价格行情哈喽,大家好!这里是化肥价格行情!关注我每天看最新化肥价格行情!今天是(1月18日)星期三!距离春节还有3天!春节临近国内化肥市场整体交投停滞!!目前复合肥走势平稳,企业停车增多,兔元素走俏年货市场,泰安这里年味十足!随着春节临近,备年货成了家家户户过春节的一件大事。近日,记者来到徂汶景区天宝镇大集,感受到了这里的年味。记者走访发现,集市上兔元素随处可见,受到大家的追捧和喜爱。红彤彤的灯笼金灿灿微软将全球裁员5,影响1。1万员工,CEO世界经济逆风下,科技仍有未来据英国天空新闻报道,当地时间1月17日,美国科技巨头微软(Microsoft)放出消息,将在本周进行大规模裁员,全球范围裁员5,微软在全球各国设立分企,拥有超22万名员工,此举将涉市场日报丨北向资金1月净流入额超去年全年!百亿猪企暴雷,猪肉股走势承压大消费行情低迷,数字经济概念全天领涨作者郑希娅封面来源视觉中国三大指数今日小幅高开,沪指高开0。1,深成指高开0。11,创业板指高开0。12。游戏股开盘领涨,三七互娱涨近5,中青宝完美世界汤姆猫巨人网络等跟涨。消息上论插入广告,谁有刘亦菲新剧这么明目张胆,也做不到如此受吹捧电视剧去有风的地方正在热播,没有什么轰轰烈烈的爱恨纠葛或者勾心斗角的职场手段,把镜头对准了云南小镇的日常,有风小院,三五好友,有猫有酒有音乐,扑面而来的都是自然与美好的气息。很少能当初死不悔改的黑粉方某登报向喻言道歉!喻言告黑取得初步成效是要干干净净地迈进新年的,最近明星告黑胜诉的消息屡见不鲜,喻言状告黑粉的漫漫长路也终于取得成效。2023年1月18日,黑粉方某登报向喻言道歉,这位无比嚣张的病态追星族也得到了她蔑视赌王何鸿燊刚过世不久,洗米华就被判18年!2023年1月18日,澳门法院宣判认定被告人周焯华(洗米华),案中大部分控诉罪名属实,裁定周焯华犯许可地方内不法经营赌博罪54项相当巨额诈骗罪等103项罪名全部成立,合共判刑18年韩红首次为电影作曲,与张艺谋就满江红配乐信函沟通八月有余昨(17)日,张艺谋导演新作满江红首映礼在北京举办。韩红作为满江红的电影作曲也出席了首映礼,并分享了创作经历。(图据韩红工作室)其实我在音乐领域里摸爬滚打这么多年,但是作为作曲的身林志颖携妻儿出游,陈若仪甜晒老公视角,三娃辣妈穿泳装身材养眼1月17日晚,林志颖爱妻陈若仪在个人社交平台分享了一组出游美照,她还开心写道久违的度假,三年没飞出去了,好心情藏都藏不住。这次陈若仪晒出多张林志颖视角的旅行美照,每一帧都能感受到她历年春晚带火了哪些梗林永健最近之所以上热搜,是因为18年前的一个春晚小品。网友们也被吓了一跳,纷纷在自己的社交账号上发了一条消息这是怎么回事,这群网友怎么搞的!林永健最近在三体中扮演常伟思将军,不过有苗苗郑恺一个假聪明,一个装糊涂最近看妻子的浪漫旅行,发现很多网友都在吐槽苗苗,说她张口闭口就是我老公。说起来也不冤,毕竟在电影芳华之后,苗苗就没有其它具有记忆点的角色了。如今她身上最大的标签,就是郑恺的妻子。两