2013-03-11 474 views
4

所以我目前的列表视图代码只是让我拖放到计算机上的文件到我的列表视图。我想要的是能够重新排列列表视图项目,问题是当我试图用drop方法覆盖导入文件并且什么也没有发生。例如,如果拖动是从listview外部的,我希望它导入,如果拖动是内部的,或者更确切地说是从listview内部拖动,我希望它只是像使用InternalMove一样移动。PyQt QListView拖放的问题导入和重新排列在一个列表中

添加这对我的代码:

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/

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

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

+1

也许[Qt在两个QListWidget之间拖放](http://stackoverflow.com/q/4591923/95735)可能有所帮助。 – 2013-03-11 10:30:22

+0

这似乎是我正在寻找的,但是一旦我有了它,我会让你知道,如果它能工作,你应该重新发布它作为答案,我可以选择它!谢谢! – Burninghelix123 2013-03-11 19:39:38

回答

3

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) 

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

+0

感谢您在此提供代码,因为您提供的链接已死亡。 – Johndt6 2017-01-09 19:14:33