2017-06-13 1 views
0

私は信号が多くの情報を送信するPyQtでシグナルスロット配列を設定しようとしています。 QObjectの属性として送信したいさまざまな情報を設定して、QObjectをキャリアとして使用したいと考えています。理論的には、これはうまくいくはずです - オーバーロードがあり、送信者とQObjectを引数にとります。オブジェクトベースQSignalMapperのトラブル

ここで減少したコードです:

self.mapper = QtCore.QSignalMapper() 
self.timeline.finished.connect(self.mapper.map) 
carrier = QtCore.QObject() 
carrier.contents = (item1, item2) 
self.mapper.setMapping(self.timeline, carrier) 
self.portalMapper.mapped.connect(self.report) 

def report(self, carrierObject): 
    print 'Triggered' 

残念ながら、それは動作しませんが。私はこの問題を、削除のプロセスによってsetMapping関数にトレースしました。

QObjectintに切り替えると、この同じ方法がうまくいきます。また、QObjectに追加した属性とは何の関係もありません。新鮮なアウトオブボックスのQObjectを使用すると、同じ問題が発生します。

の具体的なものがあると思われますが、setMappingの機能のオーバーロードはです。問題は何ですか?

+1

QSignalMapperの使用には価値がありません。カスタム信号を定義し、データを直接送信してください。 – ekhumoro

+0

私はそれを行う方法がわかりません、@ekhumoro ...私のコードが待っている信号は、Qt標準の 'QTimeline.finished'です。処理する前にタイマーが終了するのを待っているからです次のステップで私は 'finished()'信号を関数に代入してカスタム信号を送ることができますが、QSignalMapperの目的を要約すると、シグナルを受け取って新しいシグナルを送るだけではありません引数? – Grav

+1

確かに - それはずっと簡単です。あなたのコードは本当にシグナルを送信する必要がありますか?あなたの例では、信号の消費者は1つだけです( '' self'')ので、シグナルの放射は完全に冗長であるように見えます。あなたがしているのは、データ自体ではなくオブジェクトへのポインタを送信することだけです(つまり、何もコピーされません)。データ自体への参照を 'self'の属性として保持しておき、' finished'シグナルに接続されたスロットで直接アクセスすることもできます。 – ekhumoro

答えて

0

QSignalMapperのアプローチを完全にスキップして、カスタム信号を作成するという@ ekhumoroの提案に感謝します。魅力のように働いた。