两个不同类别的信号和插槽

Posted

技术标签:

【中文标题】两个不同类别的信号和插槽【英文标题】:Signals and slots in two different classes 【发布时间】:2014-01-28 00:05:25 【问题描述】:

我正在学习信号和插槽,但我对这种情况感到困惑。

上下文: 我在 ClassA 中有一个方法,它需要(从工作线程)向 ClassB(在主线程中)发出信号。工作线程执行一些繁重的处理,而主线程更新 UI 中的进度条。我需要工作线程将信号传递给主线程以更新 UI。

我不确定如何在两个不同的类之间传递信号。现在我让第一个类实例化一个信号对象(通信),将它连接到第二个类中的方法,然后在准备好时发出。这导致了段错误,所以很明显我做错了什么。

我有以下信号类:

class Communicate(QtCore.QObject):

    update_progress = QtCore.Signal()

这是ClassA中的方法,工作线程:

def methodInClassA(self, filename):

    c = Communicate()
    c.update_progress.connect(ClassB.set_progress) 

    print "emitting"
    c.update_progress.emit()

    ...

这是 ClassB 中的方法,在 UI 中更新进度条:

class ClassB(QtGui.QDialog, classB.Ui_Dialog):

    def __init__(self, parent=None):

        super(ClassB, self).__init__(parent)
        self.setupUi(self)


    def set_progress(self):

        print "RECEIVED"    
        sender = self.sender()
        self.progressBar.setValue(100)  

【问题讨论】:

【参考方案1】:

您正在将 c.update_progress 连接到 ClassB.set_progress,这是一个未绑定的方法。这在 PySide 中不起作用,我很确定它在 PyQt 中也不起作用。您需要有一个 ClassB 的 instance 并将 c.update_progress 连接到其设置进度方法,例如 c.update_progress.connect(i_am_b.set_progress)

i_am_b 必须已在别处实例化。在调用 emit 之前,您需要小心设置 i_am_b 和 A 的实例的线程关联;请参阅 QObject.moveToThread 的文档。

【讨论】:

我让主线程创建一个 ClassB 的实例,并且我有一个方法可以更新该类对象的进度值。我已将信号连接到此方法。这解决了它。谢谢!

以上是关于两个不同类别的信号和插槽的主要内容,如果未能解决你的问题,请参考以下文章

Keras LSTM 网络预测所有信号属于同一类别(在 3 个不同的类别中)

Qt 4.8:来自不同线程的两个信号和一个插槽之间的连接行为

在 QObject 之间跨不同线程连接信号/插槽

AnyLogic:具有不同优先级的两个客户类别

不同类别的两个物体的碰撞检测

我可以使用 maphilight 插件在两个不同的地图上突出显示具有相同类别的区域吗?