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 回答