首页 > 解决方案 > 在 Maya 中正确使用 PySide QThread 以避免硬崩溃

问题描述

我正在尝试使用 QThreads 在 Maya 中更新我的自定义工具的基于 Qt 的 UI。我有一个线程执行任意方法并通过发出的信号返回结果,然后我用它来更新我的 UI。这是我的自定义 QThread 类:

from PySide import QtCore


class Thread(QtCore.QThread):

    result = QtCore.Signal(object)

    def __init__(self, parent, method, **kwargs):
        super(Thread, self).__init__(parent)
        self.parent = parent
        self.method = method
        self.kwargs = kwargs

    def run(self):
        result = self.method(**self.kwargs)
        self.result.emit(result)

我传递给线程的方法是从网址获取序列化数据的基本请求,例如:

import requests

def request_method(address):
    request = requests.get(address)
    return request.json()

以下是我如何使用自定义工具中的线程来动态更新我的 UI:

...
    thread = Thread(parent=self, method=request_method, address='http://www.example.com/')
    thread.result.connect(self._slot_result)
    thread.start()

def _slot_result(self, result):
    # Use the resulting data to update some UI element:
    self.label.setText(result)
...

此工作流程适用于 Nuke 等其他 DCC,但由于某种原因,它会导致 Maya 有时会不一致地崩溃。没有错误消息,没有日志,只是硬崩溃。

这让我觉得我的 QThread 工作流程设计显然对 Maya 不友好。在使用 QThreads 时如何最好地避免 Maya 崩溃以及可能导致此特定问题的任何想法?

标签: pythonpysidemayaqthread

解决方案


我们工作室的一位工程师发现了一些与使用 Python 线程和 PyQt/PySide 相关的错误。请参阅:

记者备注:

尽管 QObject 是可重入的,但 GUI 类,尤其是 QWidget 及其所有子类,不是可重入的。它们只能在主线程中使用。


推荐阅读