4

したがって、現在のリストビューコードを使用すると、コンピューター上のファイルをリストビューにドラッグアンドドロップできます。私が欲しいのは、リストビューアイテムを再配置できるようにすることです。問題は、ファイルをインポートするためにdropメソッドで上書きしようとしても、何も起こらないことです。たとえば、ドラッグがリストビューの外側からインポートする場合、ドラッグが内部の場合、またはリストビュー内からの場合は、InternalMoveの場合と同じように単純に移動します。

これを私のコードに追加します:

self.listView.setDragDropMode(QtGui.QAbstractItemView.InternalMove);

これをコメントアウトしている間:

def dropEvent(self, event):
    if event.mimeData().hasUrls:
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()
        links = []
        for url in event.mimeData().urls():
            links.append(str(url.toLocalFile()))
        self.emit(QtCore.SIGNAL("dropped"), links)
    else:
        event.ignore()

再配置は問題なく機能しますが、ドラッグしてファイルをインポートすることはできません。

このため、上記を収集したことが問題の原因ですが、修正方法がわからず、両方が同時に機能しているため、簡単に修正できるはずです。

それが正しい方向かどうかはわかりませんが、私は知っています:

if event.mimeData().hasUrls:

リストビューの外側からの場合はtrueを返し、リストビュー内の場合はfalseを返します

上記のコードは、http: //tech.xster.net/tips/pyqt-drag-images-into-list-widget-for-thumbnail-list/ および http://zetcode.com/からのものであることに気付くでしょう。 チュートリアル/pyqt4/ dragdrop /

マウスの位置をクエリしてアイテムを削除し、最も近い位置に再度追加するセットアップを作成できることはわかっていますが、InternalMoveが組み込まれていて、ニーズに合っている場合は、非常に問題が発生するようです。

時間をありがとう、どんな助けでも大歓迎です!

4

1 に答える 1

4

Piotrの答えは、私が必要な場所への途中でした。私は実際に私の質問に対する残りの答えをここで見つけました-> http://sjt.is/2012/05/23/pyqt-and-dragndrop/

リストビューを次のように定義しただけです。

mylist = TestListView(self)

次に、クラス定義として次のコードを使用しました。

class TestListView(QtGui.QListWidget):

    def __init__(self, parent):
        super(TestListView, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setIconSize(QtCore.QSize(100, 100))
        self.itemClicked.connect(self.on_item_clicked)
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)


    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.acceptProposedAction()
        else:
            super(TestListView, self).dragEnterEvent(event)

    def dragMoveEvent(self, event):
        super(TestListView, self).dragMoveEvent(event)

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(QtCore.SIGNAL("dropped"), links)
            event.acceptProposedAction()
        else:
            super(TestListView,self).dropEvent(event)

新しいファイルがドロップされると、リストビューに接続されている関数にシグナルが送信されます。古いファイルが削除されると、移動されます。助けてくれてありがとう!

于 2013-03-12T04:34:33.117 に答える