【发布时间】:2020-12-10 16:23:02
【问题描述】:
我是新手,所以请原谅... 我故意想从不同的线程创建对象(小部件),但 pyqt5 不允许我这样做,这是我得到的错误,
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QApplication(0x1ce1e54e590), parent's thread is QThread(0x1ce1e457a50), current thread is QThread(0x1ce1fee2e50)
这是我的代码...有没有办法解决这个问题?
from PyQt5 import QtCore, QtGui, QtWidgets
import threading
import sys
class Ui_MainWindow(object):
def __init__(self):
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.thread = threading.Thread(target = self.func)
def func(self):
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(170, 160, 256, 192))
self.textBrowser.setObjectName("textBrowser")
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.thread.start()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
提前致谢:)
【问题讨论】:
-
为什么要从不同的线程创建小部件?
-
@Heike 我只想在局域网中创建一个聊天应用程序,所以当一个新用户创建一个帐户时,必须为所有其他将链接到新 textBrowser 的现有客户端创建一个新的 QpushButton,所以来自服务器的有关新客户端的消息将通过单独的线程发送,当我尝试从该线程创建按钮时,它会发出此错误(甚至调用另一个函数(实际上是方法)来执行此任务也无济于事)
-
线程间通信的常用方式是使用信号和槽。因此,您可以做的是创建一个侦听器类,该类在检测到新客户端时发送一个信号,并将该信号连接到您的主 ui 类中的一个插槽,该插槽将实际创建按钮。
标签: python multithreading user-interface pyqt5