python drag-and-drop pyqt qtreeview

python - QTreeView con soporte de arrastrar y soltar en PyQt



drag-and-drop (1)

En PyQt 4 me gustaría crear un QTreeView con la posibilidad de reorganizar su estructura con la manipulación de arrastrar y soltar.

Implementé mi propio modelo (QAbstractItemModel) para QTreeView, por lo que mi QTreeView muestra correctamente los datos. Ahora me gustaría agregar soporte para arrastrar y soltar para que los nodos del árbol puedan mover un nodo dentro del árbol de uno a otro, arrastrar y copiar, etc., pero no puedo encontrar ningún tutorial completo sobre cómo lograr esto. He encontrado algunos tutoriales y consejos para QTreeWidget, pero no para QTreeView con modelo personalizado. ¿Alguien me puede indicar dónde mirar?

Gracias.


Puede habilitar el soporte para arrastrar y soltar elementos de la vista en árbol estableciendo QtGui.QAbstractItemView.InternalMove en la propiedad dragDropMode del control treeview. También eche un vistazo a la documentación aquí. Utilizando arrastrar y soltar con vistas de elementos . A continuación se muestra un pequeño ejemplo de una vista de árbol con arrastrar y soltar interno habilitado para sus elementos.

import sys from PyQt4 import QtGui, QtCore class MainForm(QtGui.QMainWindow): def __init__(self, parent=None): super(MainForm, self).__init__(parent) self.model = QtGui.QStandardItemModel() for k in range(0, 4): parentItem = self.model.invisibleRootItem() for i in range(0, 4): item = QtGui.QStandardItem(QtCore.QString("item %0 %1").arg(k).arg(i)) parentItem.appendRow(item) parentItem = item self.view = QtGui.QTreeView() self.view.setModel(self.model) self.view.setDragDropMode(QtGui.QAbstractItemView.InternalMove) self.setCentralWidget(self.view) def main(): app = QtGui.QApplication(sys.argv) form = MainForm() form.show() app.exec_() if __name__ == ''__main__'': main()

Edición0 : modelo abstracto treeview + con soporte para arrastrar y soltar

import sys from PyQt4 import QtGui, QtCore class TreeModel(QtCore.QAbstractItemModel): def __init__(self): QtCore.QAbstractItemModel.__init__(self) self.nodes = [''node0'', ''node1'', ''node2''] def index(self, row, column, parent): return self.createIndex(row, column, self.nodes[row]) def parent(self, index): return QtCore.QModelIndex() def rowCount(self, index): if index.internalPointer() in self.nodes: return 0 return len(self.nodes) def columnCount(self, index): return 1 def data(self, index, role): if role == 0: return index.internalPointer() else: return None def supportedDropActions(self): return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction def flags(self, index): if not index.isValid(): return QtCore.Qt.ItemIsEnabled return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | / QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled def mimeTypes(self): return [''text/xml''] def mimeData(self, indexes): mimedata = QtCore.QMimeData() mimedata.setData(''text/xml'', ''mimeData'') return mimedata def dropMimeData(self, data, action, row, column, parent): print ''dropMimeData %s %s %s %s'' % (data.data(''text/xml''), action, row, parent) return True class MainForm(QtGui.QMainWindow): def __init__(self, parent=None): super(MainForm, self).__init__(parent) self.treeModel = TreeModel() self.view = QtGui.QTreeView() self.view.setModel(self.treeModel) self.view.setDragDropMode(QtGui.QAbstractItemView.InternalMove) self.setCentralWidget(self.view) def main(): app = QtGui.QApplication(sys.argv) form = MainForm() form.show() app.exec_() if __name__ == ''__main__'': main()

espero que esto ayude, saludos