Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在QListWidget上的某些项目之间删除项目?_Python_Qt_Pyqt - Fatal编程技术网

Python 如何在QListWidget上的某些项目之间删除项目?

Python 如何在QListWidget上的某些项目之间删除项目?,python,qt,pyqt,Python,Qt,Pyqt,我有自己的类继承自QListWidgetItem,另一个继承自QListWidget。我正在努力使拖放功能正常工作。我想将项目准确地插入指示器所在的位置。我无法使用标准QListWidget.dropEvent,因为它正在尝试删除QListWidgetItems。。。不是我的类的对象。以下是我的dropEvent的一部分,但它不是很好: def dropEvent(self, event): item=event.source().currentItem().clone() ol

我有自己的类继承自QListWidgetItem,另一个继承自QListWidget。我正在努力使拖放功能正常工作。我想将项目准确地插入指示器所在的位置。我无法使用标准QListWidget.dropEvent,因为它正在尝试删除QListWidgetItems。。。不是我的类的对象。以下是我的dropEvent的一部分,但它不是很好:

def dropEvent(self, event):
    item=event.source().currentItem().clone()
    oldrow=event.source().row(event.source().currentItem())
    o=event.source().takeItem(oldrow)
    del(o)
    cursorpos=self.mapFromGlobal(QtGui.QCursor.pos())
    itembefore=self.itemAt(cursorpos)
    print itembefore
    if itembefore:
        row=self.row(itembefore)
        self.insertItem(row, item)


    else:
        self.addItem(item)

现在它总是在你放置的物品之后放置物品。。。而且它并不总是显示指示器的位置。有些想法?

< P>我不知道Python,但是在C++中,你可以用强制转换来解决你的问题。(伪C++代码:)

YourListWidget::dropEvent(qdropent*event){
YourListWidgetItemClass*item=qobject_cast(事件->源()->currentItem());
}

我找到了一些解决方法。有点脏,但很管用:

def dropEvent(self, event):
    olditem=event.source().currentItem()
    currentrow=event.source().row(olditem)
    item=event.source().takeItem(currentrow)
    QtGui.QListWidget.dropEvent(self,event)
    newItem=self.findItems(olditem.text(),QtCore.Qt.MatchExactly)[0]
    row=self.row(newItem)
    o=self.takeItem(row)
    del(o)
    if event.source()!=self:
        self.insertItem(row,item)
        self.emit(QtCore.SIGNAL("moveTask"),item.itemid,self.date)
    else:
        del(olditem)
        self.insertItem(row,item)  
    event.accept()       
    self.emit(QtCore.SIGNAL("sortTasks"),self)

我使用standard dropEvent只是为了获取行号…

我不知道它有什么帮助?我已经通过克隆创建了我的类的对象(不是最好的主意,但很有效)。。。但我仍然不能在我的函数中使用标准的dropEvent,甚至不能调用QListWidget.dropEvent(self,event)。对我来说,最好的帮助是看看pythonI中的originall dropEvent函数是什么样子的。我将使用这里描述的解码mimedata的痛苦过程:但是您的答案中的
event.source()
使它简单得多。
def dropEvent(self, event):
    olditem=event.source().currentItem()
    currentrow=event.source().row(olditem)
    item=event.source().takeItem(currentrow)
    QtGui.QListWidget.dropEvent(self,event)
    newItem=self.findItems(olditem.text(),QtCore.Qt.MatchExactly)[0]
    row=self.row(newItem)
    o=self.takeItem(row)
    del(o)
    if event.source()!=self:
        self.insertItem(row,item)
        self.emit(QtCore.SIGNAL("moveTask"),item.itemid,self.date)
    else:
        del(olditem)
        self.insertItem(row,item)  
    event.accept()       
    self.emit(QtCore.SIGNAL("sortTasks"),self)