Python 无法从行插入信号获取数据

Python 无法从行插入信号获取数据,python,qt,pyqt,Python,Qt,Pyqt,我使用的是Python 3.4.3和PyQt 5.4.2,在尝试从rowsinerted信号获取数据时遇到了一些问题 我想在删除操作后从删除项附近的所有项中获取数据 下面是我的一些代码(整个模型类太大,希望这部分足够): 此代码打印所有项目的有效数据,不包括删除的项目。对于丢弃的项目,它打印“无”。在QTreeView中拖放后,所有数据都正常。怎么了 对不起,我的英语不好。似乎行插入信号在插入行之后发出,但在模型填充插入行中的数据之前发出。 所以我从dropMimeData函数调用printSo

我使用的是Python 3.4.3和PyQt 5.4.2,在尝试从rowsinerted信号获取数据时遇到了一些问题

我想在删除操作后从删除项附近的所有项中获取数据

下面是我的一些代码(整个模型类太大,希望这部分足够):

此代码打印所有项目的有效数据,不包括删除的项目。对于丢弃的项目,它打印“无”。在QTreeView中拖放后,所有数据都正常。怎么了


对不起,我的英语不好。

似乎行插入信号在插入行之后发出,但在模型填充插入行中的数据之前发出。 所以我从dropMimeData函数调用printSomeData函数(在数据被删除之后),它就工作了

以下是更正代码:

class PlModel(QtGui.QStandardItemModel):
    def __init__(self):
        QtGui.QStandardItemModel.__init__(self)
        # no need for connect
        #self.rowsInserted.connect(self.printSomeData)

    def supportedDragActions(self):
        return QtCore.Qt.MoveAction

    def supportedDropActions(self):
        return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction

    def canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex):
        if not self.itemFromIndex(QModelIndex) and p_int_1 == p_int == -1:
            return False
        elif QModelIndex.isValid():
            if self.item(self.itemFromIndex(QModelIndex).row(), 0) is None:
                return False
            else:
                return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex)
        else:
            return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex)

    def dropMimeData(self, mimedata, dropaction, row, col, modelindex):
        if not self.itemFromIndex(modelindex):
            if row == col == -1:
                return False    
            else:
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, self.index(row, 0))
                if result:
                    self.printSomeData(self.index(row, 0))
                return result
        elif self.itemFromIndex(modelindex).isDragEnabled():
            if row == col == -1:
                crow = self.item(modelindex.row(), 0).rowCount()
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, crow, 0, self.indexFromItem(self.item(modelindex.row(), 0)))
                if result:
                    self.printSomeData(self.indexFromItem(self.item(modelindex.row(), 0)))
                return result
            else:
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
                if result:
                    self.printSomeData(modelindex)
                return result
        elif self.itemFromIndex(modelindex).isDropEnabled():
            if col != -1:
                return False
            else:
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
                if result:
                    self.printSomeData(modelindex)
                return result
        else:
            result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
                if result:
                    self.printSomeData(modelindex)
                return result

    def printSomeData(self, ind: QtCore.QModelIndex):
        row = ind.row()
        item = self.itemFromIndex(ind)
        for i in range(0, item.rowCount()):
            print(self.index(i, 0, ind).data(QtCore.Qt.DisplayRole))

drop操作是如何工作的?如果有一个@tmoreau,这会有帮助。我试图扩展我的代码示例。不幸的是,模型类太大,并且依赖于程序的其他部分。
class PlModel(QtGui.QStandardItemModel):
    def __init__(self):
        QtGui.QStandardItemModel.__init__(self)
        # no need for connect
        #self.rowsInserted.connect(self.printSomeData)

    def supportedDragActions(self):
        return QtCore.Qt.MoveAction

    def supportedDropActions(self):
        return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction

    def canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex):
        if not self.itemFromIndex(QModelIndex) and p_int_1 == p_int == -1:
            return False
        elif QModelIndex.isValid():
            if self.item(self.itemFromIndex(QModelIndex).row(), 0) is None:
                return False
            else:
                return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex)
        else:
            return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex)

    def dropMimeData(self, mimedata, dropaction, row, col, modelindex):
        if not self.itemFromIndex(modelindex):
            if row == col == -1:
                return False    
            else:
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, self.index(row, 0))
                if result:
                    self.printSomeData(self.index(row, 0))
                return result
        elif self.itemFromIndex(modelindex).isDragEnabled():
            if row == col == -1:
                crow = self.item(modelindex.row(), 0).rowCount()
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, crow, 0, self.indexFromItem(self.item(modelindex.row(), 0)))
                if result:
                    self.printSomeData(self.indexFromItem(self.item(modelindex.row(), 0)))
                return result
            else:
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
                if result:
                    self.printSomeData(modelindex)
                return result
        elif self.itemFromIndex(modelindex).isDropEnabled():
            if col != -1:
                return False
            else:
                result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
                if result:
                    self.printSomeData(modelindex)
                return result
        else:
            result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
                if result:
                    self.printSomeData(modelindex)
                return result

    def printSomeData(self, ind: QtCore.QModelIndex):
        row = ind.row()
        item = self.itemFromIndex(ind)
        for i in range(0, item.rowCount()):
            print(self.index(i, 0, ind).data(QtCore.Qt.DisplayRole))