Qt在QTreeWidget之间拖放

时间:2017-11-03 08:18:26

标签: python pyqt pyqt4 pyqt5 qtreewidget

在我的QT应用程序中,我有两个QTreeWidget A和B.

我想为这两种行为重写拖放功能:

  • 从A到A移动所有孩子的物品。
  • 从B到A复制所有孩子的物品。

我认为在dropEvent函数中我有event.source()来取源。

但是如何改变旗帜的运动或复制功能?

有一个例子吗?

由于

1 个答案:

答案 0 :(得分:1)

为了执行此任务,我们必须区分操作是来自他自己还是其他窗口小部件,因为它被dropEvent方法覆盖,这会返回类型为QDropEvent的事件,该事件具有方法{ {1}}返回执行操作的对象:

source()
  
      
  • 从A到A移动所有孩子的物品。
  •   

每个def dropEvent(self, event): if event.source() == self: # move else: # copy 都与其父级相关联,因此如果它移动到父级,则子级也将移动。

QTreeWidgetItem
  
      
  • 从B到A复制所有孩子的物品。
  •   

这是最复杂的任务,因为当if event.source() == self: event.setDropAction(Qt.MoveAction) QTreeWidget.dropEvent(self, event) 使用拖放时,它使用mimetype QTreeWidget来存储与项目的QModelIndex关联的行和列的信息以及字典角色及其价值观:

x-qabstractitemmodeldatalist

所以知道行和列是不可能获得项目因此也是你的孩子,因为你必须有父母。所以你应该寻找另一个策略,解决方案是创建一个新的mimetype,你保存必要的信息再次获取项目,唯一的方法是保存项目的行,然后是父项的行,然后是父母的父母那样的行,直到你达到一些row_1 | column_1 | number of valid roles | role_1_1 | value_1_1 | ... | role_n_1 | value_n_1 | row_2 | column_2 | ...

由于您已拥有该项目,因此您可以访问您的孩子及其包含的信息。完整实施如下所示:

topLevelItem

在以下link中,您会看到一个示例