12

PyQt 4 では、ドラッグ アンド ドロップ操作で構造を再編成できる QTreeView を作成したいと考えています。

QTreeView に独自のモデル (QAbstractItemModel) を実装したので、QTreeView はデータを適切に表示します。ここで、ツリーのノードにドラッグ アンド ドロップのサポートを追加して、ツリー内のノードをある親から別の親に移動したり、ドラッグ コピーなどを実行したりしたいと考えていますが、これを達成するための完全なチュートリアルが見つかりません。QTreeWidget のチュートリアルとヒントはほとんど見つかりませんでしたが、カスタム モデルの QTreeView は見つかりませんでした。誰かが私にどこを見るべきか教えてもらえますか?

ありがとうございました。

4

1 に答える 1

18

ツリー ビュー コントロールのdragDropModeプロパティにQtGui.QAbstractItemView.InternalMoveを設定することで、ツリー ビュー アイテムのドラッグ アンド ドロップ サポートを有効にできます。こちらのドキュメントも参照してくださいUsing drag & drop with item views。以下は、アイテムの内部ドラッグ アンド ドロップを有効にしたツリービューの小さな例です。

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 : ツリービュー + ドラッグ アンド ドロップをサポートする抽象モデル

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()

これが役に立てば幸いです、よろしく

于 2010-11-13T02:02:48.513 に答える