I’m using my custom item model (subclassed from QAbstractItemModel) with custom QTreeView. I want to allow internal drag-n-drop movement (MoveAction) and, when modifier key or right mouse button is pressed, pass CopyAction to my model (to dropMimeData) to copy items. However, default implementation of dropEvent() in QTreeView seems (from C code) only capable of passing […]
- Tags -2] [3, 'Action', 'baseact', 'exception', 'node') self.insertItems(row, 'text/xml'] def mimeData(self, "...": ""}} ui = ConfigDialog(data) ui.setupUi(Dialog) print(Qt.DisplayRole) Dialog.show() print(app.exec_()) prin, "...": {'subopt': 'bal'}}, "opt2": [1.1, "opt2": 123, "opt3": 1.23, "opt4": False, "section 2": {"opt1": "str", "Value"), "Value") self.setup(data) def headerData(self, )) return True def flags(self, [droppedNode], { 'parent':parent, 1, 1) self.config_view.expandAll() #self.config_view.setDragDropMode(True) #self.setDragDropMode(QAbstractItemView.Inte, 34, action & Qt.CopyAction) print(droppedNode.itemData, action) if action == Qt.IgnoreAction: return True droppedNode = deepcopy(pickle.loads(mimedata.data('app/configi, but works horribly in terms of user interaction because there are tons of comlex code determining right index to drop item on in default impl, childItem) else: return QtCore.QModelIndex() def parent(self, column): try: return self.itemData[column] except IndexError: return None def set_data(self, column): try: self.itemData[column] = data except IndexError: return False return True, column], config_dialog): super(ConfigDialog, count) -> ((), count) self.beginRemoveRows(parent, data: dict, data); }, data): super(ConfigDialog, default implementation of dropEvent() in QTreeView seems (from C code) only capable of passing MoveAction but when I try to reimplement dropE, dict): item = ConfigModelItem(key, e.dropAction(), e): index = self.indexAt(e.pos()) parent = index.parent() self.model().dropMimeData(e.mimeData(), e): print(e.dropAction(), I'm using my custom item model (subclassed from QAbstractItemModel) with custom QTreeView. I want to allow internal drag-n-drop movement (Mov, index, index.column(), index.column()) self.dataChanged.emit(index, index.row(), index.row()) parentItem = self.nodeFromIndex(parent) parentItem.removeChild(index.row()) self.endRemoveRows(), index.row()) self.model().dropMimeData(e.mimeData(), index): if index.isValid(): return index.internalPointer() return self.rootItem def data(self, index): if not index.isValid(): return QtCore.QModelIndex() childItem = index.internalPointer() parentIt, index): if not index.isValid(): return QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled # Qt.NoItemFlags, index): parent = index.parent() self.beginRemoveRows(parent, indexes): mimedata = QtCore.QMimeData() index = indexes[0] mimedata.setData('app/configitem', is_section=False, is_section=True) self.setup(value, item_data = item.itemData if item.childItems: data[item_name] = self.to_dict(item) else:, item): self.childItems.append(item) item.parentItem = self def addChildren(self, items, label: '' }, mimedata, orientation, parent) e.accept() ... it works, parent) e.accept() def open_menu(self): menu = QMenu() menu.addAction("Create new item") menu.exec_(QCu, parent): if not self.hasIndex(row, parent): if parent.column() > 0: return 0 if not parent.isValid(): parentItem = self.rootItem, parent): print('rem', parent): return 2 def rowCount(self, parent): return QtCore.QModelIndex() parentItem = self.nodeFromIndex(parent) childItem = parentItem.child(row), parent=item) else: parent.appendChild(ConfigModelItem(key, parent=None) -> dict: if parent is None: parent = self.rootItem data = {} for item in parent.childItems:, parent=None): if parent is None: parent = self.rootItem for key, parent=None): self.itemData = [label, parent=None): super(ConfigModel, parentIndex) if action & Qt.CopyAction: return False # to not delete original item return True def removeRo, parentIndex) return True def setup(self, parentIndex) self.dataChanged.emit(parentIndex, parentIndex): print('action', parentIndex): print('ins', parentItem) def nodeFromIndex(self, pass CopyAction to my model (to dropMimeData) to copy items. However, pickle.dumps(self.nodeFromIndex(index))) return mimedata def dropMimeData(self, position): if position len(self.childItems): return False child = self.childItems.pop(position), QMenu class ConfigModelItem: def __init__(self, QStandardItemModel from PyQt5.QtWidgets import QAbstractItemView, QtCore.Qt.CopyAction) # if e.keyboardModifiers() & QtCore.Qt.AltModifier: # #e.setDropAction(QtCore.Qt.CopyAction), QtGui, QTreeView, QtWidgets from PyQt5.QtCore import Qt as Qt from PyQt5.QtGui import QCursor, role, role): if not index.isValid(): return None item = index.internalPointer() if role == Qt.DisplayRole or, role): if role == Qt.DisplayRole and orientation == Qt.Horizontal: return self.rootItem.data(section) def columnCoun, role=Qt.EditRole): if not index.isValid(): return False item = index.internalPointer() if role == Qt.Edi, row, row) parent = self.nodeFromIndex(parentIndex) self.beginInsertRows(parentIndex, row) print(parent.childItems) self.endInsertRows() self.dataChanged.emit(parentIndex, row): if row == -1: row = 0 self.childItems[row:row] = items for item in items: item.parentI, row): return self.childItems[row] def childCount(self): return len(self.childItems) def columnCount(self):, row+count-1) parentItem = self.nodeFromIndex(parent) for x in range(count): parentItem.removeChild(row), row+len(items)-1) parent.addChildren(items, Section, self).__init__() self.model = ConfigModel(data) def setupUi(self, self).__init__(parent) self.rootItem = ConfigModelItem("Option", self).dropEvent(e) dropAction() data is also lost. What can I do in order to modify dropAction without loosing all fancy things that default, self).dropEvent(e) index = self.indexAt(e.pos()) parent = index.parent() print('in', self).setupUi(config_dialog) self.config_view = Tree() self.config_view.setObjectName("config_view") self.config_vie, state='default', traceback) sys.excepthook = except_hook app = QtWidgets.QApplication(sys.argv) Dialog = QtWidgets.QDialog() data = {"secti, traceback): sys.__excepthook__(cls, value in data.items(): if isinstance(value, value)) def to_dict(self, value] self.is_section = is_section self.state = state self.childItems = [] self.parentItem = parent, when modifier key or right mouse button is pressed