2

ウィンドウとツリービューを作成するクラスがあります。ツリービューを作成するコードは非常に単純で、 initメソッドに含まれています。

    tableView = QTableView()
    tableView.setModel(model)
    tableView.clicked.connect(self.foo)  

ここで、「foo」は、コールバックを受け入れる必要がある関数(同じクラスのメンバー)の名前です。関数のシグネチャは次のとおりです。

def foo(something):
    print something  

私が理解していることから(確かに少し)、「何か」パラメーターはQModelIndexのインスタンスであるはずでしたが、そうではありません。変数でprint(something)を実行すると、ウィンドウクラスがfoo(...)に送信されたことがわかります。ここで何が欠けていますか?私はこれがこれを行う正しい方法であると仮定しました:

http://qt-project.org/wiki/Signals_and_Slots_in_PySide

何か案は?
ご協力ありがとうございました。

4

1 に答える 1

1

メソッドの最初の引数はインスタンス自体であり、暗黙的に渡され、一般に。として名前が付けられselfます。お使いのバージョンでsomethingは、渡されたパラメータではなく、インスタンスになります。メソッドは次のようになります。

def foo(self, something):
    print something

ちなみに、通常、パラメータを受け入れないメソッドにパラメータを渡すと、エラーが発生します。好き:

class Foo(object):
    def bar(something):
        print something

f = Foo()
f.bar(1)

#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#TypeError: bar() takes exactly 1 argument (2 given)

しかし、Qtでは、より少ないパラメーターを受け入れるスロットに信号を接続できます。Qtは、そのパラメーターなしでスロットを呼び出します。したがって、clickedシグナルはを通過しQModelIndexますが、このシグナルをパラメーターを受け入れないメソッド(のようにfoo)に接続することはできます。その結果、このサイレントな「バグ」が発生します。

于 2013-01-13T16:47:15.870 に答える