2012-07-20 30 views
0

我试图让QListWidget中的项目被拖动到“废纸篓”(一个接受下落并且不执行任何操作的子类组件)。完成拖动动作时的触发动作

我知道如果我setDropAction(Qt.MoveAction),我将从源中删除的项目将被自动删除。这工作正常。
我的问题是,我还需要触发一个动作,更新其他依赖源内容的小部件。

在我看来,dropEvent发生在任何项目实际上从源中删除之前。我试图找出这个问题的时间非常可怕。我想到了两个可能的解决方案:

  1. 找到一种方法嵌入到在事件的QMimeData被拖动的实际QListWidgetItems的引用。这可以让我在触发更新之前手动删除。

  2. 找出如何等待,直到源已被自动清除,但我无法找到任何信号,当项目从列表中自动删除时触发。

回答

0

啊哈!

我错过的关键是mimeData方法。这个方法在拖动开始时被调用,并且在其中我传递了所有被拖动文件的列表。

我首先构建了要返回的元对象,然后删除了从列表中拖出的文件,并调用了我需要的刷新操作。

下面是一个例子:

def mimeData(self, items): 
    m = QMimeData() 
    m.setUrls([QUrl(i.url) for i in items]) 

    # Clean up the list: 
    [self.files.takeItem(self.files.indexFromItem(i).row()) for i in items] 
    self._update_meta() 

    return m