如何将 QObject 的父级设置为单独线程中的父级

问题描述 投票:0回答:0
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
的父级设置为单独线程中的父级的正确方法是什么?

python python-3.x qt pyqt pyqt6
© www.soinside.com 2019 - 2024. All rights reserved.