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.