2013-03-11 61 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