9

私は から学ぼうとしてPyQtおりrapid gui programming with python and qt、現在 と を学んSignalsでいSlotsます。

以下は私のコードの短いスニペットです:

self.connect(self.dial, SIGNAL("valueChanged(int)"),self.spinbox.setValue) #1
self.connect(self.dial, SIGNAL("valueChanged(int)"),self.getValue_dial)    #2
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.dial.setValue)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.getValue_spinbox)

def getValue_dial(self):
        print self.dial.value()

def getValue_spinbox(self):
        print self.dial.value()

ここで達成しようとしているのは、 2SLOTS を一度に呼び出すことです。これは、信号が発信されるspinbox.setValueとすぐにgetValue_dialdialオブジェクトに対してです。ValueChanged(int)

上記のコードは、エラーなしで正常に実行さprintれ、変更された適切な値が表示されます。

私の質問は、単一のシグナルに対して複数のスロットを呼び出すのに適した上記の方法です。

上記の 2 つのステートメント (1 と 2) を組み合わせて 1 つのステートメントにすることはできますか?

ここに私の完全なコードへのリンクがあります。

4

3 に答える 3

14

あなたのやり方は大丈夫です。やるべきことがかなりある場合は、すべてを処理する新しい関数に接続できます。

getValue接続された関数で、オブジェクトから直接値を取得していることに気付きました。値がvalueChanged(int)シグナルのパラメーターとして渡されることを知っていますか? 追加のパラメーターを受け入れるように関数を変更するgetValueと、オブジェクトから直接値を取得する必要がなくなります。もちろん、getValue関数をまとめて削除し、ヘルパー関数で print ステートメントを発行することもできます。

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)

def dial_value_changed(self, value):
    self.spinbox.setValue(value)
    self.getValue_dial(value)

def spinbox_value_changed(self, value):
    self.dial.setValue(value)
    self.getValue_spinbox(value)

def getValue_dial(self, value):
        print value

def getValue_spinbox(self, value):
        print value

また、これは好みによるものですが、コードを少し読みやすくするシグナルとスロットの新しいスタイルがあります。それは

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)

上の行

self.dial.valueChanged.connect(self.dial_value_changed)
self.spinbox.valueChanged.connect(self.spinbox_value_changed)

しかし、元の質問とあなたが行っている2つのことについては、ヘルパー関数を使用するのではなく、信号を2回接続するだけです.

于 2012-05-18T13:56:09.507 に答える
6

リストを使用して、1 つのステートメントで 2 つのスロット/関数を接続できます。

# in Python 2.X
map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial])

# in Python 3.X (map returns an iterator instead of processing the list)
list(map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial]))

# or with any Python version
[self.dial.valueChanged.connect(x) for x in [self.spinbox.setValue, self.getValue_dial]]
于 2012-05-18T17:29:23.403 に答える
1

This is the appropriate way, yes. You can't combine the two CONNECT statements into one.

于 2012-05-18T13:42:52.060 に答える