Python。从W发出信号

2024-05-16 21:03:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python应用程序中工作,在Raspberry Pi上使用PySide,使用Raspbian Jessie OS。你知道吗

我对Python很陌生,我根本不是专家。所以这可能是一个乞丐的问题。你知道吗

在我的申请中,我有:

  • 主线程->;实现前端的Gui线程。你知道吗
  • subyacent thread->;做了一些长时间的工作(根本没有gui,纯代码), 在名为MyWorker的自定义类中实现。你知道吗

在亚线程代码的某些地方,我需要发出一个必须被主线程捕获的信号。在以前的版本中,我是这样做的:

主线程代码

    #Slot for clicked button
    def Slot_Start_Calculation (self):

        self.MyLongThread = QThread()
        MyLongWorker = MyWorker(self, Qty)
        MyLongWorker.moveToThread(self.MyLongThread)

        self.MyLongThread.started.connect(MyLongWorker.Run_LongWorker)
        MyLongWorker.WorkerFinished.connect(self.MyLongThread.quit)
        MyLongWorker.WorkerFinished.connect(self.MyLongWorker.deleteLater)
        MyLongThread.finished.connect(self.MyLongThread.deleteLater)

        MyLongThread.start()


    def Slot_Worker_Sent_A_Signal (self, Result):

        print ("Worker sent this result: " + str(Result))
        .
        .
        .

我的员工代码

class MyWorker(QObject):

    WorkerFinished = Signal()
    CustomSignal = Signal(int)

    def __init__(self, parent, Quantity)

        super().__init__(parent)
        self_parent = parent
        self.Quantity = Quantity
        print("Myworker's constructor")

    def __del__(self):
        print("Myworker's destructor")


    def Run_LongWorker (self):

        self.CustomSignal.connect(self.parent.Slot_Worker_Sent_A_Signal)
        .
        .
        .
        self.CustomSignal.emit(MyPartialResult)
        .
        .
        .
        self.WorkerFinished.emit()

这段代码在几周前的测试环境中运行,我完成了GUI的一些细节,没有发现任何错误。 昨天在网上搜索时,我偶然发现QObject::moveToThread不能移动有父对象的对象

https地址:[//forum.qt.io/topic/40653/qobject-movetothread-cannot-move-objects-with-a-parent][1]

所以我担心我的代码可能有问题,我还没有发现。你知道吗

我修改了这部分代码,现在是:

主线程的新代码

    #New slot for clicked button.
    def Slot_Start_Calculation (self):

        MyLongThread = QThread()
        MyLongWorker = MyWorker(Qty)
        MyLongWorker.moveToThread(MyLongThread)

        MyLongThread.started.connect(MyLongWorker.Run_LongWorker)
        MyLongWorker.WorkerFinished.connect(MyLongThread.quit)
        MyLongWorker.WorkerFinished.connect(MyLongWorker.deleteLater)
        MyLongThread.finished.connect(MyLongThread.deleteLater)

        MyLongThread.start()


    def Slot_Worker_Sent_A_Signal (self, Result):

        print ("Worker sent this result: " + str(Result))
        .
        .
        .

MyWorker的新代码

class MyWorker(QObject):

    WorkerFinished = Signal()
    CustomSignal = Signal(int)

    def __init__(self, Quantity)

        super().__init__()
        self.Quantity = Quantity
        print("Myworker's constructor")

    def __del__(self):
        print("Myworker's destructor")

    def Run_LongWorker (self):

        self.CustomSignal.connect( ??? .Slot_Worker_Sends_A_Signal)
        .
        .
        .
        self.CustomSignal.emit(MyPartialResult)
        .
        .
        .
        self.WorkerFinished.emit()

所以,现在,我真的不知道如何将这个信号连接到主线程中的一个插槽,因为如果我没有错的话,自从我更改了线程关联性之后,就没有父/子关系了。你知道吗

有人能告诉我是否有办法做到这一点,并指导我对这个问题的文档?你知道吗

非常感谢。你知道吗


Tags: 代码selfsignaldefconnectquantityparentworker
1条回答
网友
1楼 · 发布于 2024-05-16 21:03:51

最后,我想我找到了答案。在Worker类的构造函数中,我必须更改父对象引用和超类init调用。你知道吗

class MyWorker(QObject):

    WorkerFinished = Signal()
    CustomSignal = Signal(int)

    def __init__(self, parent = None, Quantity)
        super().__init__()
        self.Quantity = Quantity
        print("Myworker's constructor")

    def __del__(self):
        print("Myworker's destructor")


    def Run_LongWorker (self):

        .
        .
        .
        self.CustomSignal.emit(MyPartialResult)
        .
        .
        .
        self.WorkerFinished.emit()

现在一切都按预期进行。你知道吗

如果有人看到代码有问题,请随时告诉我。你知道吗

谢谢!你知道吗

相关问题 更多 >