纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

Qt开发线程类QThread

10月14日 莫思归投稿
  本文主要介绍Qt中线程类QThread的用法
  在这篇文章中,将写一个获取热点新闻的程序,每隔2秒发送一个关键字,从服务器获得与该关键字相关的一条热点新闻。
  我们的目标是实现以下几个功能:用户在输入框中输入n个关键字,以英文的逗号,隔开用一个搜索结果列表来呈现所获得的新闻标题使用进度条更新已获得的新闻数目用户随时可以停止获取数据
  界面设计如下图:
  上面是一个关键字输入框QLineEdit,中间使用QListWidget呈现获得的数据,下面是QProgressBar更新进度,最下面有一个停止按钮和一个开始按钮。一、代码片段1。新闻获取部分
  我们使用接口,从服务器获取数据。importjsonimporttimeimportrequestsagentMozilla5。0(WindowsNT6。2;WOW64)AppleWebKit537。36(KHTML,likeGecko)Chrome57。0。2987。8Safari537。36headers{UserAgent:agent}defgettoppost(subreddit):从服务器获取数据urlhttps:www。reddit。comr{}。json?limit1。format(subreddit)try:restextrequests。get(url,headersheaders)datajson。loads(restext。text)toppostdata〔data〕〔children〕〔0〕〔data〕exceptExceptionase:print(e)return错误数据return{title}by{author}in{subreddit}。format(toppost)defgettopfromsubreddits(subreddits):forsubredditinsubreddits:yieldgettoppost(subreddit)time。sleep(2)ifnamemain:forpostingettopfromsubreddits(〔python,php,learnpython〕):print(post)输出结果
  上面是获取并处理新闻数据的程序。需要注意的是其中time。sleep(2),之所以每次发送请求要隔两秒,是因为服务器出于性能考虑,只允许每2秒发送一次请求,否则可能会得到错误的数据。在这里有3个关键字,python、php、learnpython,所以整个过程持续了大约6秒。
  不必在意其中实现的细节,因为本文的重点是线程,而不是获取数据。
  【领更多QT学习资料,点击下方链接免费领取,先码住不迷路】
  点击领取Qt学习资料2。基本界面
  我们可以在代码中实现所有控件和布局;也可以用QtDesigner设计好,然后使用命令pyuic5oyourui。pyyourui。ui生成界面代码。
  在这里,我用的是第一个方法:definitUI(self):self。setWindowTitle(QThreadStudy)keywordLblQLabel(关键字(以逗号,隔开):)self。keywordEditQLineEdit()hrLayoutQHBoxLayout()hrLayout。addWidget(keywordLbl)hrLayout。addWidget(self。keywordEdit)resultLblQLabel(搜索结果:)self。resultListQListWidget()vrLayoutQVBoxLayout()vrLayout。addWidget(resultLbl)vrLayout。addWidget(self。resultList)self。searchProgBarQProgressBar()self。searchProgBar。setValue(0)self。stopBtnQPushButton(停止)self。stopBtn。setEnabled(False)self。startBtnQPushButton(开始)hrLayout1QHBoxLayout()hrLayout1。addWidget(self。stopBtn)hrLayout1。addWidget(self。startBtn)vrLayout1QVBoxLayout(self)vrLayout1。addLayout(hrLayout)vrLayout1。addLayout(vrLayout)vrLayout1。addWidget(self。searchProgBar)vrLayout1。addLayout(hrLayout1)二、未使用多线程
  如果没有使用多线程,你可能会这么做:写好新闻获取的代码、写好界面代码,接下来简单地调用函数处理数据。这么做可以,但所有工作都在单独的GUI线程中完成,所以执行函数获取新闻时,你的程序将会被冻结住。
  就像这样:
  主线程被锁住直到程序执行结束,搜索结果列表才会更新输入框以及其它界面中的元素都无法使用一旦函数开始执行,就没法停止获取数据
  下面是主要代码(点击开始按钮进入槽函数获取新闻数据):classThreadTestUI(QWidget):definit(self,parentNone):super()。init(parent)self。initUI()建立信号槽连接self。startBtn。clicked。connect(self。startBtnClicked)defstartBtnClicked(self):subredditliststr(self。keywordEdit。text())。split(,)ifsubredditlist〔〕:print(没有搜索内容)returnself。resultList。clear()forpostinself。gettopfromsubreddits(subredditlist):self。resultList。addItem(post)三、使用多线程
  没有使用多线程将导致程序卡住,体验很差,下面将使用QThread类重写我们的代码。
  首先要做的就是写一个线程,这个线程与之前新闻获取部分gettoppost和gettopfromsubreddits做相同的事,每当获得新数据就立即更新界面,而且允许用户点击停止按钮停止获取数据。1。QThread的基本结构
  QThread类很简单,它的整体结构如下:fromPyQt4。QtCoreimportQThreadclassYourThreadName(QThread):definit(self):QThread。init(self)defdel(self):self。wait()defrun(self):yourlogichere
  你可以通过给构造方法init添加参数,将数据传给线程。
  在run方法中处理你的数据。
  注意不能直接调用run方法,而是通过start方法间接调用它,否则界面仍有可能被冻结住。
  接下来是使用上面你定义的线程:self。myThreadYourThreadName()self。myThread。start()
  如此,在run方法中写的代码得以执行,可以使用像isRunning这样的方法检测线程是否正在运行。
  你可能会经常用到这些QThread的方法:quit、start、terminate、isFinished、isRunning。
  还有QThread的这些信号:finished、started、terminated。2。我们的程序
  介绍完QThread类,下面回到我们的新闻获取程序。
  我们可以很容易地将获取新闻的代码移到QThread类,除了修改run方法,其它地方基本保持原样。
  另一个小的变化是,需要将新闻关键字的列表传到线程类中,从而在run方法中使用这些关键字。defsetSubReddit(self,subReddit):self。subredditssubRedditdefrun(self):forsubredditinself。subreddits:toppostself。gettoppost(subreddit)self。sleep(2)
  gettoppost方法是从之前的新闻获取代码直接复制过来的,在run方法中遍历之前设置的关键字subreddits。
  主界面类:self。testThread。setSubReddit(subredditlist)self。testThread。start()
  OK,程序将在单独的线程中运行,然后根据关键字获取所有热点新闻。
  但是,界面中的元素还没有得到更新,没有反馈给用户,所以我们还需做些什么。
  当然,不能简单地在线程类中这么写:self。searchProgBar。setValue(int),因为它指向QThread对象,而不是UI对象。
  在数据处理线程和UI线程之间沟通的正确方法是使用信号。四、信号
  数据获取线程在背后运行,主界面线程需要获得数据(比如新闻标题),从而更新界面元素(比如进度条和新闻列表)
  下面先讲一下Pyqt的信号,它与C中信号槽连接有所不同。1。内建信号
  获取数据结束之后需要通知用户,我们将使用一个所有QThread实例都有的信号。
  首先写一个线程结束后我们想要执行的代码,比如打印一条信息,我们在主界面类中这么写:defthreadFinished(self):print(获取结束)
  接下来是信号的连接,将QThread实例发出的信号与我们线程结束后打印信息的函数连接起来:self。testThreadGetPostThread()
  self。testThread。finished。connect(self。threadFinished)
  内建信号与槽函数的连接很直接,自定义信号与之唯一的不同就是,我们首先需要在QThread类中定义一个信号,在主线程中的写法是一样的。
  所以接下来2。自定义信号
  想要像内建信号一样使用自定义信号,首先需要定义它们,在QThread类中定义信号:postSignalpyqtSignal(str)
  注意:定义的信号有一个参数,类型是字符串str。
  run方法中处理并获得数据,然后通过信号将其发出:defrun(self):forsubredditinself。subreddits:toppostself。gettoppost(subreddit)self。postSignal。emit(toppost)self。sleep(2)
  主线程获得信号,并将它与信号处理函数(槽函数)相连接:self。testThread。postSignal。connect(self。getPostSlot)
  信号发出时带有一个字符串参数(在这里是新闻的标题),定义信号处理函数时也设置一个额外的参数,获得传来的字符串:defgetPostSlot(self,toppost):self。resultList。addItem(toppost)self。searchProgBar。setValue(self。searchProgBar。value()1)
  将获得的新闻标题呈现在列表中,并调整进度条的数值。
  【领更多QT学习资料,点击下方链接免费领取,先码住不迷路】
  点击领取QT音视频开发学习资料五、总结
  到此为止,我们已经完成所有工作:从新闻网站获取新闻的线程线程与主线程的连接如何实现自定义信号如何使用内建信号注意:在QThread线程类中处理数据,通过信号将数据发送到主界面线程,进而更新界面元素
  看一下现在界面是怎么样的吧:
  你将看到:每获得一条新数据,界面立即更新界面仍然可响应,比如拖动、改变输入框内容主线程没有被锁住随时可以点击停止按钮,停止获取数据
投诉 评论

海尔GE与人单合一在人身上找出路接手通用电气家电业务(GEA),用6年的时间,把其从一个被出售的业务部门,培育成美国家电行业第一品牌。没有更换设备,也没有空降管理者,海尔凭借人单合一理念,打造了资本市场上逆境……图实用长沙旅游攻略带你体验星城的饮食魅力长沙是一座历史名城,是湘楚文化的发源地,拥有几千年的历史。长沙不仅文人辈出,历史文化遗迹众多,而且也是名至实归的美食之城,在这里你可以吃到各种特色的小吃。1、橘子洲。这个……图小米note顶配最坚挺从手机工坊到零售电商如何蜕变小米note顶配版是小米有史以来营销最用心的一部机型。它搭载了Miui6的操作系统,CPU采用的是高通骁龙801的芯片,支持快速充电,拥有5。7的大屏堪称完美。2015年……图都江堰熊猫乐园超好玩体验别样的亲子时间大熊猫是我们特别喜爱的濒危动物。在成都都江堰地区有一个熊猫乐园,就是为了保护他们而成立的。爸爸妈妈可以携带自己的孩子一起到这里来,体验一次终身难忘的亲子游。四川省是大熊猫……图手机摄影专家浅谈努比亚minis不知道从什么时候起,努比亚开始了产品线的多样化。在旗舰机发布后,努比亚并没有放弃中端市场的份额,所以努比亚minis应运卫生,性能够用,好看恰到好处。时隔半年的时间努比亚……Qt开发线程类QThread本文主要介绍Qt中线程类QThread的用法在这篇文章中,将写一个获取热点新闻的程序,每隔2秒发送一个关键字,从服务器获得与该关键字相关的一条热点新闻。我们的目标是……走出大山去看拉萨走!去和布达拉宫拍个合影中国西藏网讯近日,来自西藏日喀则市昂仁县多白乡的30名小学生来到拉萨参加领略非凡世界放飞多彩梦想公益性春令营活动。在布达拉宫广场,学生们非常激动,纷纷走进学校带队老师罗珍和记者……图虎丘湿地公园好玩吗空气新鲜能净化心灵虎丘湿地公园的风景优美,而且空气十分好,因此我们可以选择在周末带上朋友或者是孩子来到此地游玩。我们不仅可以在公园里面放风筝、吃烧烤,同时还可以在里面散步、骑行。虎丘湿地公……男篮世预赛中国队再次大胜日本,背后藏着多少不可告人的秘密?男篮世预赛:中国队再次大胜日本,背后藏着多少不可告人的秘密?网友热议一针见血地指出:这两场日本打得就跟落选赛咱们打加拿大希腊一样,看不到任何希望,差距不是阿联和小丁不伤就能弥补……图青海湖油菜花沉迷天堂不知归路七月,青海湖有纯粹的蓝,艳丽的黄,水天一色的天际线,白云以一种怒放的姿态肆意翻滚。在这个美丽的七月,青海湖的油菜花盛开又是一番怎样的美景呢?让我们去看看吧!青海湖的油菜花……女性长期熬夜,将会发生什么?大家好,我是黄钰玲医生。女性长时间熬夜,对身体有什么危害呢?我来告诉你一:皮肤受损女性长时间熬夜,会使皮肤出现干燥、弹性差、晦暗无光、黑斑、长痘、黑眼圈眼袋等问题。……图泰山海拔有多少出发前要记住这些事泰山是非常有名的景点,因此许多人都会选择去泰山旅行。此外,我们在去泰山游玩的时候一定要注意,要尽量提前准备一根登山杖,这样更利于我们攀爬泰山。泰山的海拔不是很高,因此我们……
扑街是什么意思求解扑街背后的意思揭晓日本屎宴是不是真的日本屎宴究竟是个什么梗?响水市民凌晨献血怎么回事,盐城化工厂爆炸后续浙江现20斤巨萝卜这究竟是个什么梗?长白山天池突现水怪,照片揭露事实真相(错位的效果)街头乞丐十大骗术最后一种不能忍(让骗术无所遁形)味精恐惧症爷青回和爷青结是什么意思此梗的来源及意思介绍吃完火锅身上有味道怎么办几个小妙招教你轻松搞定四川女教师坠亡事件真相到底是什么?十大最强恐龙(十大最强恐龙排名图片)9岁男孩小区遇害怎么回事现场画面曝光被活活打死等待琴缘初中作文卫衣怎么搭配才时髦2018卫衣穿搭攻略图矮牵牛花修剪教程21,清零!中超已无不胜球队,升班马迎来历史时刻,狂欢庆祝百款魅力编发扎发潮流时尚最甜美中天星座与太阳的相位房屋租赁要交哪些税费?人生哲理作文600字第八号当铺韩诺为保护家人而离开,却只能看着亲人先自己而去旅游景点的作文跳棋比赛常干吃枸杞有什么好处干嚼枸杞对身体的作用

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形