2012-10-11 3 views
1

У меня есть пользовательский QListView:Как определить, где элемент был удален в qlistview?

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

from Diagnostics import Trace2 #writes to log file 
import traceback 

class ListOrderView(QListView): 

    itemMoved = pyqtSignal(int, int, QStandardItem) # Old index, new index, item 

    def __init__(self, parent=None): 
     try: 
      super(ListOrderView, self).__init__(parent) 

      self.setAcceptDrops(True) 
      self.setDragEnabled(True) 
      self.setDragDropMode(QAbstractItemView.InternalMove) 
      self.setDefaultDropAction(Qt.MoveAction) 

      self.setEditTriggers(QAbstractItemView.NoEditTriggers) 
      self.setSelectionBehavior(QAbstractItemView.SelectRows) 
      self.setSelectionMode(QAbstractItemView.SingleSelection) 

      self.dragItem = None 
      self.dragRow = None 

      self.indexesMoved.connect(self.onIndexesMoved) 
      #self.installEventFilter(self) 
     except: 
      Trace2.WriteLine(str(traceback.format_exc())) 

    def onIndexesMoved(self, indexes): 
     Trace2.WriteLine("indexes were moved") 

    def dropEvent(self, event): 
     try: 
      super(ListOrderView, self).dropEvent(event) 

      self.selectionModel().setCurrentIndex(self.model().indexFromItem(self.dragItem), QItemSelectionModel.SelectCurrent) 
      Trace2.WriteLine("[LISTVIEW] item dropped") 
      Trace2.WriteLine("[LISTVIEW] current index is %d" %self.selectionModel().currentIndex().row()) 
      Trace2.WriteLine("[LISTVIEW] current selection is %d" %self.selectionModel().selection().indexes()[0].row()) 

      self.itemMoved.emit(self.dragRow, self.row(self.dragItem), self.dragItem) 
      self.dragItem = None 
     except: 
      Trace2.WriteLine(str(traceback.format_exc())) 

    def startDrag(self, supportedActions): 
     try: 
      self.dragItem = self.currentItem() 
      self.dragRow = self.row(self.dragItem) 
      super(ListOrderView, self).startDrag(Qt.MoveAction) 
     except: 
      Trace2.WriteLine(str(traceback.format_exc())) 

    def currentItem(self): 
     index = self.currentIndex() 
     item = self.model().itemFromIndex(index) 
     #Trace2.WriteLine("[LISTVIEW] currentItem = %s" % item.data(Qt.DisplayRole).toString()) 
     return item 

    def row(self, item): 
     #index = self.model().indexFromItem(item) 
     index = self.selectedIndexes()[0] 
     row = index.row() 

     #Trace2.WriteLine("[LISTVIEW] row = %d" %row) 
     return row 

И мне действительно нужно знать, где этот пункт был исключен после перетаскивания операции, так что другие вещи могут быть должным образом обновленное падение (я пытаюсь поставить перетащить в что-то никогда не предназначалось для этого, большое приложение, а не мой дизайн). Текущий индекс и выбор модели выбора не следуют за отброшенным предметом, они остаются позади, эффективно выбирая новый предмет и закручивая вещи. Есть ли способ заставить их двигаться с отброшенным элементом? Индексы сигналовMoved похоже на то, что я хочу, но он никогда не срабатывает. Я использую это неправильно? Есть ли другой способ?

ответ

2

Я думаю, что вам, возможно, придется на самом деле есть модель сказать вам, где-то упал, так как он будет в конечном счете обрабатывать движение:

class Model(QStandardItemModel): 

    rowDropped = pyqtSignal(int) 

    def dropMimeData(self, *args): 
     success = super(Model, self).dropMimeData(*args) 
     if success: 
      self.rowDropped.emit(args[2]) 
     return success 

Это будет испускать, от модели, номер строки, на которой произошло падение. В вашем представлении уже известно, какой элемент был перетаскиван из своих событий.

Я уверен, что есть другие способы отслеживания объекта, а затем повторного запроса после завершения капли.

+0

Фантастический! Огромное спасибо :) –

Смежные вопросы