python - PyQt:将项目从 ListView 拖放到 TableView 中,放置索引始终为-1

标签 python qt drag-and-drop pyqt pyqt4

在我的代码中,我已经成功实现了从一个 QListView 到另一个 QListView 的拖放,并且内部移动也工作正常。 现在,由于必要,我修改了接受拖放的 View ,即我尝试从 QListView 拖动到 QTableView。

问题是,当我放到 QTableView 上时,每次它都会打印无效索引,即 -1(在 dropEvent() 中打印该索引。

在我之前的 ListView 之间的实现中,即使项目被放置在项目之间,索引也会适当更新。这里的情况并非如此。谢谢回答。

class SerialTestStepListView(QtGui.QTableView):
    itemSelectionChanged = pyqtSignal()
    casualSignal3 = pyqtSignal()
    casualSignal4 = pyqtSignal()

    def __init__(self,parent = None):
        QListView.__init__(self, parent)
        self.setAcceptDrops(True)
        # Hide column here......
        self.setSelectionMode(self.SingleSelection) 
        self.setDragDropMode(self.InternalMove)
        self.setSelectionBehavior(self.SelectRows)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat("application/xml-chirag"):
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat("application/xml-chirag"):
            event.setDropAction(QtCore.Qt.MoveAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        data = event.mimeData()
        bstream = data.retrieveData("application/xml-chirag", QtCore.QVariant.ByteArray)
        selected = pickle.loads(bstream)
        index = self.indexAt(event.pos()).row()
        print("into the drop event")
        print(index)  # This is printing -1
        print(self.indexAt(event.pos()))
        self.emit(SIGNAL("casualSignal3"),selected, index)
        event.accept()

    def startDrag(self, event):
        indx = self.indexAt(event.pos())
        index = indx.row()
        print("into the drag event")
        self.emit(SIGNAL("casualSignal4"),indx, index)
        if not indx.isValid():
            pass
        else:
            return True

    def mouseMoveEvent(self, event):
        self.startDrag(event)

型号为:

class SerialTestListModel(QtCore.QAbstractListModel):

    def __init__(self, testStep = [], parent = None):
        QtCore.QAbstractListModel.__init__(self, parent)
        self.__TestSteps = testStep

    def rowCount(self, parent):
        return len(self.__TestSteps)

    def flags(self, index):
        if index.isValid():
            return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEnabled | QtCore.Qt.MoveAction
        else:
            return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled  | QtCore.Qt.ItemIsEnabled

    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            return self.__TestSteps[row]

    def setData(self, index, value, role = QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.DisplayRole:
            self.dataChanged.emit(index,index)
            return True
        return False

    def insertRows(self, position, rows, selected, parent = QtCore.QModelIndex()):

        if selected is None:
            pass
        else:
            if ((position == -1) and (selected is not None)):
                position = self.rowCount(parent)
            self.beginInsertRows(parent, position, position + rows - 1)
            for i in range(rows):
                self.__TestSteps.insert(position, selected)        
            self.endInsertRows()
            return True

    def removeRows(self, position, rows, parent = QtCore.QModelIndex()):
        if position == -1:
            pass
        else:
            self.beginRemoveRows(parent, position, position + rows - 1)
            for i in range(rows):
                value = self.__TestSteps[position]
                self.__TestSteps.remove(value)
            self.endRemoveRows()
            return True

Controller 部分:

SerialTestStepListViewHdlr = CTC.SerialTestStepListView()
    SerialTestStepListViewHdlr.show()
    SerialTestStepListViewHdlr.connect(SerialTestStepListViewHdlr, SIGNAL("casualSignal3"), acceptDrag)


def acceptDrag(selected, index):
    SerialTestStepListModel = mod.SerialTestListModel(testStep)
    #selected = str(selected)
    SerialTestStepListModel.insertRows(index, 1, selected)
    SerialTestStepListViewHdlr.setModel(SerialTestStepListModel)

最佳答案

更换后问题已解决:

index = self.indexAt(event.pos()).row()

index = self.rowAt(event.pos().y())

在 dropEvent() 方法中。

关于python - PyQt:将项目从 ListView 拖放到 TableView 中,放置索引始终为-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496320/

相关文章:

c++ - 二维图像上的 FFTW 错误反向变换 [with Qt]

qt - 如果超出范围,如何在 QML TextInput 中隐藏文本

qt - Qt 的 QGraphicsScene 中的抗锯齿使重叠线变暗

java - Android/Java - 将 textView 添加到拖放 GridView 教程/示例

python - Flask:根据 Content-Type header 获取请求参数

Python:带有 2 个样本的二维 Kolmogorov-Smirnov

python - 获取 B 列中 A 列中找到的字符串数,并在新列中返回值

python - 有序 = True 不受尊重。 python +棉花糖+ flask

javascript - 在 Vue.js 中将外部图像拖过(dragenter)时在放置区域(文件输入)添加类

c++ - Qt 冰箱磁铁示例中的重叠标签