Signals PyQt5在类之间发送信号?

Signals PyQt5在类之间发送信号?,signals,pyqt5,Signals,Pyqt5,我有两个类(A、B、C、D),其中一个是包含progressbar的GUI类(A)。 那么,有可能从B、C、D类向A类发送进度信号吗 在伪代码中,它类似于: from a import A from PyQt5.Core import pyqtSignal class B(QObject): ... self.gui = A() progress = pyqtSignal(int) def connect_and_send(self, value):

我有两个类(A、B、C、D),其中一个是包含progressbar的GUI类(A)。 那么,有可能从B、C、D类向A类发送进度信号吗

在伪代码中,它类似于:

from a import A
from PyQt5.Core import pyqtSignal

 class B(QObject):
     ...
     self.gui = A()
     progress = pyqtSignal(int)

     def connect_and_send(self, value):
         self.progress.connect(self.gui.progressBar)
         self.progress.emit(value)

但也许还有更好的办法,那就是我的混乱方法?

据我看,你的基本想法是对的。:)几乎没有什么事情可以改进

首先,调用
connect\u和\u send(…)
将导致在每次调用函数时创建信号插槽连接。所以最好在别处建立连接

其次,您使用了新型的信号插槽,这对您很好,但连接是错误的。您有一行
self.progress.connect(self.gui.progressBar)
。这将导致progressbar对象本身按如下方式调用
self.gui.progressbar()
,并触发
TypeError

Traceback (most recent call last):
  File "...", line ..., in ...
TypeError: 'QProgressBar' object is not callable
self.progress.connect(self.gui.progressBar)
更改为
self.progress.connect(self.gui.progressBar.setValue)
。此调用将产生您想要的
self.gui.progressBar.setValue()

因此,您的最终代码可以更改为如下内容:

from a import A
from PyQt5.Core import pyqtSignal

class B( QObject ) :
    ...
    progress = pyqtSignal(int)
    ...

    def prepareGui( self ) :
        self.gui = A()
        self.gui.progressBar.setRange( 0, 100 )
        self.progress.connect( self.gui.progressBar.setValue )

        # You'll want to show the GUI
        self.gui.show()       

    def some_function( self ) :
        ...
        ...
        ...

        self.progress.emit( <some_number> )

这样首先显示GUI。然后非gui元素开始工作,并与gui交互以在progressBar中显示进度

谢谢,这非常有用
class B(QObject):
    progress = pyqtSignal( int )

    # Other class constructs/functions/members
    ...
    ...

class A( QMainWindow ) :
    """Qt Application Details
    """

    def __init__( self ) :
        """Class initialiser
        """

        ...

        self.createGUI()
        self.setupBCD()

    def createGUI( self ) :

        # Create you progress bars and other gui
        ...
        ...

        self.progressBar = QProgressBar( self )
        self.progressBar.setRange( ... )

    def setupBCD( self ) :

        # Setup classes B, C and D
        self.classB = B()
        self.classB.progress.connect( self.progressBar.setValue )

        # Similar connection for others
        ...
        ...