gpt4 book ai didi

python - PySide:以新语法从 QThread 发出信号

转载 作者:行者123 更新时间:2023-12-01 03:56:57 24 4
gpt4 key购买 nike

我正在尝试(和研究)从工作的 Qthread 向主窗口发出信号,但收效甚微。我似乎不明白应该如何在新语法中解决这个问题。

这是一个简单的示例。

from PySide.QtCore import *
from PySide.QtGui import *
import sys
import time

class Dialog(QDialog):

def __init__(self, parent=None):
super(Dialog, self).__init__(parent)

button = QPushButton("Test me!")

layout = QVBoxLayout()
layout.addWidget(button)
self.setLayout(layout)

#self.button.clicked.connect(self.test) ----> 'Dialog' object has no attribute 'button'
self.connect(button, SIGNAL('clicked()'), self.test)
self.workerThread = WorkerThread()


def test(self):
self.workerThread.start()
QMessageBox.information(self, 'Done!', 'Done.')


class WorkerThread(QThread):

def __init__(self, parent=None):
super(WorkerThread, self).__init__(parent)

def run(self):
time.sleep(5)
print "Thread done!"


app = QApplication(sys.argv)
dialog = Dialog()
dialog.show()
app.exec_()

我知道,如果我没有另一个线程,我会在 Dialog 类中创建信号并将其连接到 __init__ 但如何创建可以从 Dialog 类发出的自定义信号WorkerThread又要用test()吗?

作为一个附带问题。您可以看到它注释掉了连接信号的新语法错误的代码。这是我的配置中的问题吗?

我使用的是 OsX El Capitan,Python 2.7

非常感谢任何帮助!非常感谢

TL:DR:我想在 5 秒后从 WorkerThread 发出一个信号,以便测试函数仅在使用新语法完成工作线程后才显示 QMessageBox。

最佳答案

好吧,我花了很长时间才弄清楚这个问题。我的主要资源是:http://www.matteomattei.com/pyside-signals-and-slots-with-qthread-example/

在新语法中,为了处理来自不同线程的信号,您必须为信号创建一个类,如下所示:

class WorkerThreadSignal(QObject):
workerThreadDone = Signal()

这就是 WorkerThread 最终的样子:

class WorkerThread(QThread):

def __init__(self, parent=None):
super(WorkerThread, self).__init__(parent)
self.workerThreadSignal = WorkerThreadSignal()

def run(self):
time.sleep(3)
self.workerThreadSignal.workerThreadDone.emit()

对于 Dialog 类上的连接:

    self.workerThread = WorkerThread()
self.buttonn.clicked.connect(self.test)

和:

    self.workerThreadSignal = WorkerThreadSignal()
self.workerThread.workerThreadSignal.workerThreadDone.connect(self.success)

def success(self):
QMessageBox.warning(self, 'Warning!', 'Thread executed to completion!')

因此,一旦发出信号,就会调用 success 方法。

我花了最长的时间才弄清楚的是最后一行代码。我原本以为我可以直接连接到 WorkerThreadSignal 类,但至少在本例中,它只有在我回溯它的位置后才起作用。从Dialog init到WorkerThread init再回到WorkerThreadSignal。我从上面提到的网站上得到了这个提示。

我觉得很奇怪,我必须在两个类上创建相同的局部变量,也许有一种方法可以创建一个全局变量,我可以引用所有当前的解决方案,但它现在有效。

我希望这可以帮助那些也陷入这个过程的人!

PS:连接的语法问题也已解决。所以一切都是用新语法编写的,这很棒。

关于python - PySide:以新语法从 QThread 发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com