2016-07-09 2 views
1

2つのカップルクラス(A、B、C、D)があり、そのうちの1つはプログレスバーを含むGUIクラス(A)です。 B、C、Dクラスの進捗信号をAクラスに送ることは可能ですか?擬似コードでPyQt5はクラス間でシグナルを送信しますか?

それはのようなものです:

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) 

しかし、多分もっと良いもの、私の厄介なアプローチことがありますか?

答えて

0

私の知る限りでは、基本的な考え方が正しいと思います。 :)いくつか改善することができます。

最初に、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の進捗状況を表示します

+0

ありがとう、それは非常に有用でした – kazak

関連する問題