私の知る限りでは、基本的な考え方が正しいと思います。 :)いくつか改善することができます。
最初に、connect_and_send(...)
を呼び出すと、関数を呼び出すたびにシグナルスロット接続が作成されます。したがって、接続を他の場所に作成する方がよいでしょう。
第2に、新しいスタイルの信号スロットを使用していますが、接続に問題があります。あなたは、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>)
になります。
だからあなたの最終的なコードはsome_function()
を呼び出す前にprepareGui()
関数を呼び出すように注意してくださいのような::
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>)
ものに変更することができ、そうでない場合は、接続が行われていないだろう、とプログレスバーが取得することはありません更新しました。
[b]編集:[/ b] この質問についてもっと考えると、コマンドラインからGUIを呼び出さない限り、理想的な場合にクラスを逆にする必要があると思います。非常にありそうもない。 B、C及びDは、非GUIがあり、以来
、あなたがこのような中で、それらをインスタンス化することもできます。
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の進捗状況を表示します
ありがとう、それは非常に有用でした – kazak