2012-03-15 171 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獲得行號...