QTreeView在PyQt中具有拖放支持 [英] QTreeView with drag and drop support in PyQt

查看:856
本文介绍了QTreeView在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆