0

コードを 1 つではなく複数の listView で動作させようとしていますが、問題が発生しています。

1 つのリストの作業コード:

Class Ui_MainWindow(QtGui.QMainWindow):
    def itemDropped(self, links):
        item = QtGui.QListWidgetItem(url, self.listView)
    def setupUi(self, MainWindow):
        self.connect(self.listView, QtCore.SIGNAL("dropped"), self.itemDropped)  

Class TestListView(QtGui.QListWidget):
    def dropEvent(self, event):
        self.emit(QtCore.SIGNAL("dropped"), links)

これまでに複数のリストを使用するために持っているもの:

Class Ui_MainWindow(QtGui.QMainWindow):
    def itemDropped(self, links, listName):
        item = QtGui.QListWidgetItem(url, listName)
    def setupUi(self, MainWindow):
        self.connect(self.listView, QtCore.SIGNAL("dropped"), self.itemDropped(self.listView))  

Class TestListView(QtGui.QListWidget):
    def dropEvent(self, event):
        self.emit(QtCore.SIGNAL("dropped"), links)

そのため、「self.itemDropped(self.listView)」でエラーが発生し、ここや他のサイトで調査した結果、次のように思いつきました。

self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda : self.itemDropped(self.listView)))

私はPythonにまったく慣れていないので、これまでラムダ関数を使用したことはありませんでしたが、listNameを印刷すると問題が修正され、正しく表示されました。現在の問題は、リンクが他のクラスから正しく発信されていないか、正しく受信されていないことです。

したがって、疑似コードには次のようなものが必要だと思います:

self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda : self.itemDropped(X, self.listView)))

問題は、TestListView クラスからのリンクである X を取得するにはどうすればよいかということです。関数に変数が渡されていないときに、1つのリストだけでそれらを受け取った方法がよくわかりません。

皆さんが提供できるすべての助けに感謝します。PyQT4 : ファイルを QListWidget にドラッグ アンド ドロップします。

4

1 に答える 1

1

欲しいものはこれ

self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda X: self.itemDropped(X, self.listView)))

シグナルを送信すると、links変数がスロットに渡されます。self.itemDroppedこれは以前は (署名は でしたself.itemDropped (links))。

代わりに、slot はラムダ関数になったので、定義を で開始して、1 変数の関数として定義する必要がありますlambda X:。これによりX、残りのラムダ定義が利用可能になります。

シグナルが発行されると、ラムダ関数が呼び出され、Xが含まれますlinks

一般的に: def foo(x): do_something(x) foo(3)

my_function = lambda x: do_something(x) my_function(3) と同等です。

わかる?

編集: ラムダ関数内で変数を使用する場合 (特に、ラムダ関数の定義で指定されていない変数の使用など) には、いくつかのトリッキーな点があることも指摘する必要があります (将来のアプリケーションについて)。self.listView)。ラムダ関数が呼び出されると(シグナルが発行されると)、self.listView関数が定義されたときの値ではなく、現在の値が何であれ使用されます。これは、ループ内でラムダ関数を定義し、ラムダ関数内でループ変数を使用しようとすると問題になります。ここでいくつかの有用な情報を見つけることができます (コメントも読んでください) http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

于 2013-01-20T08:04:22.427 に答える