setstandardbuttons functions python drag-and-drop pyqt pyqt4 qlistview

python - functions - ¿Cómo saber dónde se dejó caer un elemento en qlistview?



pyqt sqlite (1)

Tengo un QListView personalizado:

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

Y realmente necesito saber dónde se colocó el artículo después de una operación de arrastrar y soltar para que otras cosas se puedan actualizar correctamente (estoy tratando de ponerlo y soltarlo en algo nunca diseñado para eso, una gran aplicación, no mi diseño). El índice y la selección actual del modelo de selección no siguen el elemento descartado, se quedan atrás seleccionando efectivamente un nuevo elemento y arruinando las cosas. ¿Hay alguna manera de hacer que se muevan con el artículo que se cayó? Los índices de señalMoved parecen exactamente como lo que quiero, pero nunca se dispara. ¿Lo estoy usando mal? ¿Hay una manera diferente / mejor?


Creo que es posible que necesite que el modelo le indique dónde se retiró algo, ya que finalmente se encargará de la mudanza:

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

Esto emitirá, del modelo, el número de fila en el que se produjo la caída. Su vista ya sabe qué elemento fue arrastrado y soltado de sus propios eventos.

Estoy seguro de que hay otras maneras en términos de rastrear el objeto y luego consultarlo una vez que la caída se haya completado.