在我的代码中,我已成功将Drag n Drop从一个QListView实现到另一个QListView,内部移动也正常。 现在,由于必要性,我修改了接受drop的视图,即我试图从QListView拖动到QTableView。
问题是,当我放在QTableView上时,每次打印无效索引,即-1(在dropEvent()中打印时。
在我之前在列表视图之间的实现中,即使在项目之间删除项目,索引也已适当更新。这不是这种情况。谢谢回答。
class SerialTestStepListView(QtGui.QTableView):
itemSelectionChanged = pyqtSignal()
casualSignal3 = pyqtSignal()
casualSignal4 = pyqtSignal()
def __init__(self,parent = None):
QListView.__init__(self, parent)
self.setAcceptDrops(True)
# Hide column here......
self.setSelectionMode(self.SingleSelection)
self.setDragDropMode(self.InternalMove)
self.setSelectionBehavior(self.SelectRows)
def dragEnterEvent(self, event):
if event.mimeData().hasFormat("application/xml-chirag"):
event.accept()
else:
event.ignore()
def dragMoveEvent(self, event):
if event.mimeData().hasFormat("application/xml-chirag"):
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
else:
event.ignore()
def dropEvent(self, event):
data = event.mimeData()
bstream = data.retrieveData("application/xml-chirag", QtCore.QVariant.ByteArray)
selected = pickle.loads(bstream)
index = self.indexAt(event.pos()).row()
print("into the drop event")
print(index) # This is printing -1
print(self.indexAt(event.pos()))
self.emit(SIGNAL("casualSignal3"),selected, index)
event.accept()
def startDrag(self, event):
indx = self.indexAt(event.pos())
index = indx.row()
print("into the drag event")
self.emit(SIGNAL("casualSignal4"),indx, index)
if not indx.isValid():
pass
else:
return True
def mouseMoveEvent(self, event):
self.startDrag(event)
模型是:
class SerialTestListModel(QtCore.QAbstractListModel):
def __init__(self, testStep = [], parent = None):
QtCore.QAbstractListModel.__init__(self, parent)
self.__TestSteps = testStep
def rowCount(self, parent):
return len(self.__TestSteps)
def flags(self, index):
if index.isValid():
return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEnabled | QtCore.Qt.MoveAction
else:
return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEnabled
def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
row = index.row()
return self.__TestSteps[row]
def setData(self, index, value, role = QtCore.Qt.DisplayRole):
if role == QtCore.Qt.DisplayRole:
self.dataChanged.emit(index,index)
return True
return False
def insertRows(self, position, rows, selected, parent = QtCore.QModelIndex()):
if selected is None:
pass
else:
if ((position == -1) and (selected is not None)):
position = self.rowCount(parent)
self.beginInsertRows(parent, position, position + rows - 1)
for i in range(rows):
self.__TestSteps.insert(position, selected)
self.endInsertRows()
return True
def removeRows(self, position, rows, parent = QtCore.QModelIndex()):
if position == -1:
pass
else:
self.beginRemoveRows(parent, position, position + rows - 1)
for i in range(rows):
value = self.__TestSteps[position]
self.__TestSteps.remove(value)
self.endRemoveRows()
return True
控制器部分:
SerialTestStepListViewHdlr = CTC.SerialTestStepListView()
SerialTestStepListViewHdlr.show()
SerialTestStepListViewHdlr.connect(SerialTestStepListViewHdlr, SIGNAL("casualSignal3"), acceptDrag)
def acceptDrag(selected, index):
SerialTestStepListModel = mod.SerialTestListModel(testStep)
#selected = str(selected)
SerialTestStepListModel.insertRows(index, 1, selected)
SerialTestStepListViewHdlr.setModel(SerialTestStepListModel)
答案 0 :(得分:2)
更换后解决了这个问题:
index = self.indexAt(event.pos()).row()
与
index = self.rowAt(event.pos().y())
在dropEvent()方法中。