如何在QListWidget中在某些项之间放置项目?

2024-09-29 06:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有自己的类继承自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)

在你把物品扔到你身上之后。。。它并不总是显示指示器的位置。有什么想法吗?在


Tags: 项目selfeventsource标准item指示器row
2条回答

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

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)

我使用标准的dropEvent只是为了得到行号。。。在

我不知道Python,但是C++中你可以用 Case来解决你的问题。(伪C++代码:)

YourListWidget::dropEvent(QDropEvent * event) {
    YourListWidgetItemClass* item = qobject_cast<YourListWidgetItemClass* >(event->source()->currentItem());
}

相关问题 更多 >