3
です。私のコードでは、ドラッグアンドドロップを1つのQListViewから別のQListViewに実装しています。 今、必要性のために、私はドロップを受け入れるビューを変更しました。つまり、代わりにQListViewからQTableViewにドラッグしようとしています。PyQt:リストビューからアイテムをドラッグしてテーブルビューにドロップすると、ドロップインデックスは常に-1
私は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
コントローラ一部:
index = self.indexAt(event.pos()).row()
をdropEvent()メソッドで
index = self.rowAt(event.pos().y())
で:
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)