PySide/PyQt 中的 QtConcurrent

Posted

技术标签:

【中文标题】PySide/PyQt 中的 QtConcurrent【英文标题】:QtConcurrent in PySide/PyQt 【发布时间】:2015-09-03 14:40:40 【问题描述】:

我正在尝试确定子类化 QtConcurrent 并在其中编写 run 方法是否可行:

class Task(QtCore.QtConcurrent):

     def run(self, function):
           function()

还是完全没用?

【问题讨论】:

你为什么不试一试? 【参考方案1】:

它完全没用,因为QtConcurrent 是一个命名空间,而不是一个类。

另外,PyQt 和 PySide 都不提供 QtConcurrent 提供的任何功能,因为它都是基于模板的,因此无法包装。

PS:您链接到的 PySide 文档适用于 ReduceOption 枚举。由于该枚举在 QtConcurrent 命名空间之外是否有任何用途值得怀疑,因此 PySide 包含它可能是一个错误。

【讨论】:

非常有趣。当我意识到我找不到任何东西时,我正要在 PyQt5 中尝试一下QtConcurrent。感谢您的提示。我猜是C++。 :D 有人可以用 Python 重写所有这些 QtConcurrent 吗?我认为这不会很容易,但有可能吗?我们在 Python 的 concurrent.futures 中有 Futures 似乎令人沮丧,但 PyQt5 陷入了黑暗时代。 @mikerodent Templates 是 C++ 功能,这意味着 QtConcurrent 在 Python 中无法以任何有意义的方式实现。您也许可以想出一些替代 API 来重现 一些 功能,但它不再是 QtConcurrent(例如 qconcurrent.py)。不过,我怀疑是否值得任何人花时间尝试复制所有内容(当然,PyQt 的作者在被问到时从未表现出任何兴趣)。【参考方案2】:

您要查找的课程是QRunnable。

【讨论】:

这不提供调用任何我不认为的函数的能力......这里唯一的选择是从QThread继承。请参阅上面的解决方案。【参考方案3】:

我在 PyQt5 中遇到了同样的问题。我想唯一的解决方案是在本地执行此操作:

def connect(self):
    class ConnectThread(QThread):
        def __init__(self, func):
            super().__init__()
            self.func = func
        def run(self):
            self.func()
    self.connectThread = ConnectThread(self._connect)
    self.connectThread.start()

def _connect(self):
    if self._driver is None:
        uri = self.uriString()
        if uri and self.user and self.password:
            self.statusMessage.emit("Connecting to the Graph Database....", -1, "color:blue;")
            try:
                self._driver = GraphDatabase.driver(uri, auth=(self.user, self.password))
                self.statusMessage.emit("Connected!", 5000, "color:green;")
            except Exception as e:
                self.clearStatusMessage.emit()
                Error(str(e)).exec_()
                if __debug__:
                    raise e

记住将线程设置为成员变量:self.thread = ...,否则您的线程引用将超出范围,并且很可能线程对象被删除。

您还可以将您的函数调用移动到它的本地定义中,因为 Python 允许嵌套函数和类相互之间!

【讨论】:

以上是关于PySide/PyQt 中的 QtConcurrent的主要内容,如果未能解决你的问题,请参考以下文章

如何为布局中的列设置正确的大小 - PySide/PyQt

单击其中的链接后,QTextBrowser 中的 PySide/PyQt 文本消失

如何创建一个新的窗口按钮 PySide/PyQt?

PyQt 或 PySide:QTextEdit 取消全选

PySide/PyQT5:如何从 QGraphicsItem 发出信号?

模型数据未更改时刷新视图(Qt/PySide/PyQt)?