Trying to implement drag and drop for QAbstractItemModel
    Rodrigo de Salvo Braz 
    rodrigobraz at gmail.com
       
    Mon Apr 19 01:15:00 BST 2021
    
    
  
Hi,
I want to use drag and drop for a QAbstractItemModel. I followed the
instructions at Qt's documentation
<https://doc.qt.io/archives/qt-5.5/model-view-programming.html#using-drag-and-drop-with-item-views>
quite carefully, but when I try a drag-and-drop, the program crashes.
I'm using PyQt 5.9.2 / Qt 5.9.7 installed with conda, on Windows 10.
Any idea what I am doing wrong here? Thanks.
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView,
QAbstractItemView
# Attempting to implement drag-and-drop for an QAbstractTableModel as
described in
# https://doc.qt.io/archives/qt-5.5/model-view-programming.html#using-drag-and-drop-with-item-views
class TableModel(QtCore.QAbstractTableModel):
    def __init__(self):
        super().__init__()
        self.dataList = [["Lion", "Tiger", "Bear"], ["Gazelle", "Ox",
"Pig"], ["Mouse", "Cat", "Dog"]]
    def data(self, index, role=None):
        if role == Qt.DisplayRole:
            return f"{self.dataList[index.row()][index.column()]}"
    def setData(self, index, value, role):
        if role == Qt.EditRole:
            self.dataList[index.row()][index.column()] = value
            return True
    def rowCount(self, index):
        return len(self.dataList)
    def columnCount(self, index):
        return 3
    def flags(self, index):
        return Qt.ItemIsSelectable | Qt.ItemIsEditable |
Qt.ItemIsEnabled | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled
    def supportedDropActions(self):
        return Qt.CopyAction | Qt.MoveAction
    def insertRows(self, row: int, count: int, parent) -> bool:
        self.beginInsertRows(parent, row, row + count)
        self.dataList[row : row + count] = ["", "", ""] * count
        self.endInsertRows()
        return True
    def removeRows(self, row: int, count: int, parent) -> bool:
        self.beginRemoveRows(parent, row, row + count)
        del self.dataList[row : row + count]
        self.endRemoveRows()
        return True
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("A drag-and-drop table app")
        self.tableView = QTableView()
        self.model = TableModel()
        self.tableView.setModel(self.model)
        self.tableView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.tableView.setDragEnabled(True)
        self.tableView.viewport().setAcceptDrops(True)
        self.tableView.setDropIndicatorShown(True)
        self.tableView.setDragDropMode(QAbstractItemView.InternalMove)
        self.setCentralWidget(self.tableView)
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20210418/b404f93a/attachment.htm>
    
    
More information about the PyQt
mailing list