python – 如何在pyQt4中的不同线程中清除QTextEdit
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何在pyQt4中的不同线程中清除QTextEdit,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2415字,纯文字阅读大概需要4分钟。
内容图文
![python – 如何在pyQt4中的不同线程中清除QTextEdit](/upload/InfoBanner/zyjiaocheng/721/bc008468fa954ca7a4026052b7e81864.jpg)
我在我的程序的“主”线程中创建了一个QTextEdit组件
然后我开始另一个线程,它将每隔x秒更新一次这个QTextEdit,但后来我得到了这个错误:
QObject: Cannot create children for a parent that is in a different thread.
这就是我这样做的方式:
def initGui():
#some gui components
global txt_list
txt_list = QtGui.QTextEdit(w)
txt_list.resize(580,400)
txt_list.move(50, 50)
txt_list.setReadOnly(1)
txt_list.setFont(font_consolas)
#more gui components
def update_list():
t_monitor = threading.Thread(target=monitor_vector)
t_monitor.daemon = True
t_monitor.setName('monitor')
t_monitor.start()
def monitor_vector():
#retrieve info...
lock = threading.Lock
lock = True
txt_list.clear() #clear list, to set the new one
txt_list.setText('updated list')
lock = False
这最后两行代码给出了上面提到的错误.有人能给我一个如何处理这个问题的线索吗?
谢谢!
解决方法:
关于Qt的一个主要问题是你不能从主GUI线程以外的任何线程调用任何QWidget方法.所有的通信都必须通过从额外线程发出信号来完成,这些信号将转发到主gui.
首先,我看到你正在使用全局变量,并且缺少self关键字,所以我假设你没有使用类.我的例子也将包含一个类示例.
这个例子很简单,就像你的一样,概述了你可能想要的方向:
from PyQt4 import QtGui, QtCore
class MyWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
...
self.txt_list = QtGui.QTextEdit(self)
self.txt_list.resize(580,400)
self.txt_list.move(50, 50)
self.txt_list.setReadOnly(1)
self.txt_list.setFont(font_consolas)
...
self.monitor = Monitor()
self.monitor.updateText.connect(self._handleTextUpdate)
self.monitor.update_list()
def _handleTextUpdate(self, txt):
self.txt_list.clear()
self.txt_list.setText(txt)
class Monitor(QtCore.QObject):
updateText = QtCore.pyqtSignal(str)
def update_list(self):
t_monitor = Thread(self.monitor_vector, parent=self)
t_monitor.daemon = True
t_monitor.setName('monitor')
t_monitor.start()
def monitor_vector(self):
...
self.updateText.emit('updated list')
class Thread(QtCore.QThread):
def __init__(self, fn, args, kwargs, parent=None):
super(Thread, self).__init__(parent)
self._fn = fn
self._args = args
self._kwargs = kwargs
def run(self):
self._fn(*self._args, **self._kwargs)
需要注意的主要是线程中运行的函数是发出信号.他们不了解其他课程中的QWidgets.您的MyWidget类将信号连接到可以更新QLineEdit的插槽.当线程发出信号时,它将排队到主线程并由接收槽执行.
我还创建了一个简单的QThread子类,它可以接受一个函数和args,复制标准的lib Thread类的工作方式.您应该坚持使用QThread,因为它是一个QObject子类,并且支持信号并且可以运行事件循环.
内容总结
以上是互联网集市为您收集整理的python – 如何在pyQt4中的不同线程中清除QTextEdit全部内容,希望文章能够帮你解决python – 如何在pyQt4中的不同线程中清除QTextEdit所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。