在我的QT应用程序中,我有两个QTreeWidget A和B.
我想为这两种行为重写拖放功能:
我认为在dropEvent函数中我有event.source()来取源。
但是如何改变旗帜的运动或复制功能?
有一个例子吗?
由于
答案 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中,您会看到一个示例