2012-11-01 21 views
1

我有一個簡單的TreeWidget,填充了子類TreeWidgetItems。當其中一個項目通過內部拖放事件移動時,如何捕獲移動的項目?當在QTreeWidget中拖放QTreeWidgetItems時,如何捕獲移動的項目以便檢索其新父項?

當物品移動時,我想抓住物品,這樣我就可以得到它的新父物品。

我已經嘗試使用eventFilter來尋找一個ChildRemoved事件,但是當我問孩子的事件時,它返回一個通用的QObject,而不是我的子類。我錯過了什麼?

def eventFilter(self, sender, event): 
    if event.type() == QtCore.QEvent.ChildRemoved: 
     widgetItemThatMoved = event.child() 
     self.updateSomething(widgetItemThatMoved) 
    return False 

謝謝!

回答

1

,你將需要實現一個dragEnterEvent,dragMoveEvent和dropEvent

要訪問下降QTreeWidgetItem(S),你這樣做正確的dropEvent

class myTreeWidget(QtGui.QTreeWidget): 
    def __init__(self, parent = None): 
     super(myTreeWidget, self).__init__(parent) 
     self.setAcceptDrops(True) 


    def dragEnterEvent(self, event): 
     print('dragEnterEvent happened') 
     event.acceptProposedAction() 

    def dragMoveEvent(self, event): 
     print('dragMoveEvent happened') 
     event.acceptProposedAction() 

    def dropEvent(self, event): 
     print('dropEvent happened') 
     widgetItemThatMoved=event.source().currentItem() 
     parentThatReceivedIt=self.itemAt(event.pos()) 
     self.theFunc(parentThatReceivedIt,widgetItemThatMoved) 
     event.acceptProposedAction() 

    def functionToCallWhenDropped(self,theFunc): 
     #this method allows you to pass a reference to this class so you assign it to a local variable for easy calling. 
     self.theFunc=theFunc 

內這將是很好添加一個額外的方法functionToCallWhenDropped這樣就可以有機會獲得父類的方法,在父類,你會做這樣的事情

def someMethod(self): 
     self.tw=myTreeWidget(parent) 
     self.tw.functionToCallWhenDropped(self.wasDropped) 

    def wasDropped(self, newParent, theMovedChild): 
     #this method will be called the very moment you drop the item 
     print(newParent.text(0)+" => "+theMovedChild.text(0)) 

I H這有助於某人。

+0

嘿@Ajayi Oluwaseun Emmanuel 糾正我,如果我錯了,但這隻返回最後選擇的項目。如何在拖動後返回所有選定的項目?所以,如果我拖動5個項目,我有5個指向新項目的指針? – Dariusz