所以我当前的 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 外则返回真,如果在 ListView 内则返回假
您很可能会注意到上面的代码来自: http://tech.xster.net/tips/pyqt-drag-images-into-list-widget-for-thumbnail-list/ 和 http://zetcode.com/tutorials/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)
当删除新文件时,它会向连接到 ListView 的函数发出信号。当删除旧文件时,它会被移动。感谢您的帮助!
关于python - 用于在一个列表中导入和重新排列的 PyQt QListView 拖放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15331001/