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