class DownloadWindow(QWidget):
# Irrelevant class attributes and methods
self.downloads_layout = QVBoxLayout(self)
@pyqtSlot(str, int, dict)
def receive_download_progress_bar_details(self, episode_title: str, episode_size: int):
bar = DownloadProgressBar(None, "Downloading", episode_title, 400, 33, episode_size, "MB", ibytes_to_mbs_divisor)
self.downloads_layout.insertWidget(0, bar)
class DownloadManagerThread(QThread):
# Irrelevant class attributes and methods
send_progress_bar_details = pyqtSignal(str, int)
# In __init__
self.send_progress_bar_details.connect(download_window.receive_download_progress_bar_details)
def run(self):
for idx, link in enumerate(self.anime_details.direct_download_links):
# Get progress bar data
self.send_progress_bar_details.emit(episode_title, download_size)
错误:
QObject: Cannot create children for a parent that is in a different thread.
DownloadWindow
对象在start()
对象上创建并调用DownloadManagerThread
,然后DownloadManagerThread
最终发出一个信号,其中包含创建DownloadProgressBar
对象所需的数据。
我的假设是,由于它是信号槽连接,因此该对象将在
DownloadWindow
的线程中创建,但显然情况并非如此,因此出现错误。
我尝试致电
QMetaObject.invokeMethod(bar, "setParent", Qt.ConnectionType.BlockedQueuedConnection, Q_ARG(QVBoxLayout, self.downloads_layout))
,但收到不同的错误 QMetaMethod::invoke: Unable to handle unregistered datatype 'QVBoxLayout*'RuntimeError: QMetaObject.invokeMethod() call failed
。 DownloadProgressBar
源自QWidget
。
我尝试致电
bar.moveToThread(self.thread())
,但仍然收到第一个错误。
基本上,将
QObject
的父级设置为单独线程中的父级的正确方法是什么?