2012-03-15 94 views
0

我有我自己的类继承自QListWidgetItem,另一类继承自QListWidget。我正在尝试使拖放功能正常工作。我想要将项目完全插入指示符所在的位置。我不能使用标准的QListWidget.dropEvent,因为它试图删除QListWidgetItems ...而不是我的类的对象。这里是我的dropEvent的一部分,但它不是真正的好:如何在某些项目之间删除QListWidget上的项目?

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) 

现在它总是下降的项目,你就...放下该项目后,它其中显示指标始终不是。一些想法?

回答

0

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

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

我不知道它如何帮助?我已经通过克隆它来创建我的类的对象(不是最好的主意,但工程)...但我仍然不能使用标准的dropEvent,甚至在我的函数中调用QListWidget.dropEvent(self,event)。对我来说最好的帮助就是看看python中的originall dropEvent函数的外观 – middleofdreams 2012-03-15 08:40:53

0

我找到了一些解决方法。有点脏,但工程:

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获得行号...