QTreeView在PyQt中具有拖放支持 [英] QTreeView with drag and drop support in PyQt
问题描述
在PyQt 4中,我想创建一个QTreeView,可以通过拖放操作重组其结构。
我已经实现了自己的模型(QAbstractItemModel)for QTreeView所以我的QTreeView正确显示数据。
现在我想添加对树节点的拖放支持,以便能够将树中的一个节点从一个父项移动到另一个父节点,拖放等等,但是我找不到任何完整的教程实现这一点我已经找到了很少的QTreeWidget的教程和提示,但不是QTreeView与自定义模型。
有人可以指点我看看吗?
谢谢。
您可以通过将 QtGui.QAbstractItemView.InternalMove 设置为 dragDropMode 属性的treeview控件。另请参阅这里的文档使用drag&删除项目视图。下面是一个树状视图的一个小例子,它的项目启用了内部拖放功能。
从PyQt4导入sys
导入QtGui,QtCore
class MainForm(QtGui.QMainWindow):
def __init __(self,parent = None):
super(MainForm,self).__ init __(parent)
self.model = QtGui.QStandardItemModel()
在范围(0,4)中的k:
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_()
如果__name__ =='__main__':
main()
Edit0 :具有拖放支持的treeview +抽象模型
来自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,父项)
return self.createIndex(row,column,self.nodes [row])
def parent(self,index):
return QtCore.QModelIndex()
def rowCount(self,index):
如果index.internalPointer()在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):
如果不是index.isValid():
返回QtCore.Qt.ItemIsEnabled
返回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')
返回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_()
如果__name__ =='__main__':
main()
希望这有助于,
In PyQt 4 I would like to create a QTreeView with possibility to reorganize its structure with drag and drop manipulation.
I have implemented my own model(QAbstractItemModel) for QTreeView so my QTreeView properly displays the data. Now I would like to add drag and drop support for tree's nodes to be able to move a node inside the tree from one parent to another one, drag-copy and so on, but I cannot find any complete tutorial how to achieve this. I have found few tutorials and hints for QTreeWidget, but not for QTreeView with custom model. Can someone point me where to look?
Thank you.
You can enable drag and drop support for tree view items by setting QtGui.QAbstractItemView.InternalMove into the dragDropMode property of the treeview control. Also take a look at the documentation here Using drag & drop with item views. Below is a small example of a treeview with internal drag and drop enabled for its items.
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()
Edit0: treeview + abstract model with drag and drop support
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()
hope this helps, regards
这篇关于QTreeView在PyQt中具有拖放支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!