【问题标题】:Can not get data from rowsInserted signal无法从 rowsInserted 信号中获取数据
【发布时间】:2015-07-08 00:03:10
【问题描述】:

我正在使用 Python 3.4.3 和 PyQt 5.4.2,在尝试从 rowsInserted 信号中获取数据时遇到了一些问题。

我想在放置操作后从放置的物品附近的所有物品中获取数据。

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

class PlModel(QtGui.QStandardItemModel):
    def __init__(self):
        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:
                return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, self.index(row, 0))
        elif self.itemFromIndex(modelindex).isDragEnabled():
            if row == col == -1:
                crow = self.item(modelindex.row(), 0).rowCount()
                return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, crow, 0, self.indexFromItem(self.item(modelindex.row(), 0)))
            else:
                return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
        elif self.itemFromIndex(modelindex).isDropEnabled():
            if col != -1:
                return False
            else:
                return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)
        else:
            return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex)

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

此代码打印所有项目的有效数据,不包括丢弃的项目。对于丢弃的项目,它会打印“无”。放入 QTreeView 后,所有数据都正常。有什么问题?

对不起,我的英语不好。

【问题讨论】:

  • drop 操作是如何工作的?有一个MCVE 会有所帮助。
  • @tmoreau 我试图扩展我的代码示例。不幸的是,模型类太大了,并且依赖于我程序的其他部分。

标签: python qt pyqt


【解决方案1】:

似乎 rowsInserted 信号在插入行之后发出,但在模型填充插入行中的数据之前。 所以我从 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2011-10-24
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多