据我所知,您的基本想法是正确的。 :) 几乎没有什么可以改进的。
首先,调用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中显示进度