【问题标题】:PyQt5 sending signals between classes?PyQt5 在类之间发送信号?
【发布时间】:2016-07-09 13:57:36
【问题描述】:

我有两个类(A、B、C、D),其中一个是包含进度条的 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)

但也许有更好的东西,我的凌乱方法?

【问题讨论】:

    标签: signals pyqt5


    【解决方案1】:

    据我所知,您的基本想法是正确的。 :) 几乎没有什么可以改进的。

    首先,调用connect_and_send(...) 会导致每次调用函数时都会创建信号槽连接。所以最好在别处创建连接。

    其次,您使用了新样式的信号槽,对您有好处,但连接错误。你有线self.progress.connect(self.gui.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( <some_integer_value> ),这就是您想要的。

    因此您的最终代码可以更改为::

    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> )
    

    在调用some_function()之前注意调用prepareGui()函数,否则连接不上,进度条也不会更新。

    [b]编辑:[/b] 我对这个问题思考得越多,我就越觉得在理想情况下应该颠倒类,除非你从命令行调用 GUI,这是不太可能的。

    由于 B、C 和 D 是非 gui,您可能希望像这样在 A 中实例化它们:

    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
            ...
            ...
    

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

    【讨论】:

    • 谢谢,很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多