はんぎょねこの憂鬱

耳から変な汁が出てきた

PySide 編集可能なQTreeWidgetを作る

f:id:dungeonneko:20170622151448g:plain

import sys
from PySide import QtCore, QtGui


class MyTreeWidget(QtGui.QTreeWidget):
    def __init__(self):
        super().__init__()
        self.setHeaderHidden(True)
        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.contextMenuRequested)

        # アイテムの移動を有効にする
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
        self.setDragEnabled(True)
        self.viewport().setAcceptDrops(True)

        # 挿入位置カーソルを表示する
        self.setDropIndicatorShown(True)

    def contextMenuRequested(self, pos):
        """ コンテキストメニュー
        """
        menu = QtGui.QMenu()
        item = self.itemAt(pos)
        if item:
            action = QtGui.QAction('Delete Item', self)
            action.triggered.connect(lambda: self.removeItem(item))
            menu.addAction(action)
        else:
            action = QtGui.QAction('New Item', self)
            action.triggered.connect(self.createNewItem)
            menu.addAction(action)
        menu.exec_(self.mapToGlobal(pos))

    def createNewItem(self):
        """ 新規項目
        """
        item = QtGui.QTreeWidgetItem()
        item.setText(0, 'Item')

        # アイテムを編集可能にする
        item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)

        self.addTopLevelItem(item)

    def removeItem(self, item):
        """ 項目削除
        """
        parent = item.parent()
        if parent:
            parent.takeChild(parent.indexOfChild(item))
        else:
            self.takeTopLevelItem(self.indexOfTopLevelItem(item))


app = QtGui.QApplication(sys.argv)
tr = MyTreeWidget()
tr.show()
sys.exit(app.exec_())