簡體   English   中英

PyQt QListView拖放問題,用於在一個列表中導入和重新排列

[英]PyQt QListView Issue with Drag and Drop for both importing and rearranging in one list

所以我當前的listview代碼只允許我將計算機上的文件拖放到我的listview中。 我想要的是能夠重新排列listview項目,問題是當我嘗試用drop方法覆蓋導入文件時沒有任何反應。 例如,如果拖動來自listview外部我希望它導入,如果拖動是內部的,或者更確切地說是在listview中,我希望它只是像使用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:

如果來自listview之外,則返回true,如果在listview中,則返回false

您很可能會注意到上面的代碼來自: http//tech.xster.net/tips/pyqt-drag-images-into-list-widget-for-thumbnail-list/http://zetcode.com/教程/ PyQt4中/的DragDrop /

我知道我可以創建一個查詢鼠標位置的設置並刪除項目並在最近的位置重新添加它,但是當內置的InternalMove並且滿足我的需求時,這似乎很麻煩。

任何幫助將不勝感激,謝謝你的時間!

Piotr的回答是我需要的地方的一半。 我實際上在這里找到了我的問題的其余答案 - > http://sjt.is/2012/05/23/pyqt-and-dragndrop/

我只是將listview定義為:

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)

刪除新文件時,它會向連接到列表視圖的函數發出信號。 刪除舊文件時​​會移動它。 謝謝您的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM