PyQt QListView 拖放问题,用于在一个列表中导入和重新排列

Posted

技术标签:

【中文标题】PyQt QListView 拖放问题,用于在一个列表中导入和重新排列【英文标题】:PyQt QListView Issue with Drag and Drop for both importing and rearranging in one list 【发布时间】:2013-02-26 04:21:53 【问题描述】:

所以我当前的列表视图代码只允许我将计算机上的文件拖放到我的列表视图中。我想要的是能够重新排列列表视图项目,问题是当我尝试使用 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/tutorials/pyqt4/dragdrop/

我知道我可以创建一个设置来查询鼠标位置并删除项目并在最近的位置重新添加它,但是当 InternalMove 内置并满足我的需要时,这似乎很麻烦。

任何帮助将不胜感激,感谢您的时间!

【问题讨论】:

也许Qt drag and drop between two QListWidget 会有所帮助。 这似乎是我正在寻找的东西,但是一旦我让它工作,我会告诉你,如果它确实有效,你应该重新发布它作为答案我可以选择它!谢谢! 【参考方案1】:

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)

当新文件被删除时,它会向连接到列表视图的函数发出信号。当旧文件被删除时,它会被移动。感谢您的帮助!

【讨论】:

感谢您在此处包含代码,因为您提供的链接已失效。

以上是关于PyQt QListView 拖放问题,用于在一个列表中导入和重新排列的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 QListView 拖放创建新的隐藏项

PyQt5-高级控件使用(QListView)

PyQt5 组件之QListView

Qt拖放QListView删除它被释放的项目

PyQt4 - 在 QListView 中的项目上按下 Enter 键

PyQt QListView在用户界面编辑项目后检索项目