2017-06-08 7 views
2

私は信号とスロットの新旧のスタイルについて多くを読んでいます。今は簡単だと思いますが、私は1つの問題に取り組んでいます。PyQt4からPyQt5へのマイグレーション

私のプロジェクトでは、古いコードは、渡された名前に基づいて動的信号を生成します。

例:

self.netlink.connect(self.netlink,SIGNAL(self.modelName + "_gotCommand"),self.processCommand) 

、ここでは

self.emit(SIGNAL(model + "_gotCommand"), cmd, data) 

データは、どのように私はでき再びモデル

に基づいてdiffrenetタイプ(リスト、タプル、文字列など)することができ発しています私たちがpyqtSignal定義で各信号を記述する必要があるので、このコードをQt5に移動してください。

+0

@のekhumoroの答え怒鳴るは素晴らしいです。あなたがまだ疑問を持っているなら、少し前に私がいくつかの小さな例を使って答えたことがあるのを見てください。 https://stackoverflow.com/questions/41787777/how-do-i-use-signals-from-a-qwidget-to-tell-the-main-window-to-execute-a-functio/41794580#41794580 – yurisnm

答えて

0

新しいスタイルの構文を使用して任意の信号を動的に出力することはできません。すべての信号は、クラス内であらかじめ定義されている必要があります。

この例では、常に同じスロットに接続しているため、モデルごとに異なる信号名を使用する必要があることがわかりません。

class SomeModel(QObject): 
    gotCommand = pyqtSignal(str, str, object) 

    def doSomething(self): 
     ... 
     self.gotCommand.emit(model, cmd, data) 

... 

self.netlink.gotCommand.connect(self.processCommand) 

しかし、あなたはまだキーによって放出/信号を接続する必要がある場合、あなたは getattrを使用することができます。各モデルが必要な場合は、おそらくまた、モデル名を送信し、同じ信号を発する持っているより多くの意味をなすように思われます:

getattr(self.netlink, self.modelName + "_gotCommand")).connect(self.processCommand) 

と:

getattr(self, model + "_gotCommand").emit(cmd, data) 
+0

それは悲しいですが、私は典型的な窓を持っているので、ダイナミックな信号が必要です。ポートフォリオと価格を言いましょう。したがって、ポートフォリオ1の変更は、価格1ウィンドウとポートフォリオ2のみの価格に影響します。2.したがって、ウィンドウの名前にidを追加し、実行時にシグナルスロット接続を作成します。 –

関連する問題