qmmed中的Python对象

2024-09-28 22:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在基于我的定制模型实现拖放式QTreeView。一切都很好,我的树显示数据,拖放被启用,现在最后一步就在我面前——拖放和传输拖动的数据。为此,我需要在模型中实现mimeTypes、mimeData和dropMimeData方法。现在我的问题是:有没有简单的标准方法可以通过QMimeData传递任意Python对象?我只是在QTreeView中做了一个内部移动,它显示了Python类Person的层次结构。我想重新排序。不能在应用程序之外拖放,甚至不能超出控制范围。我只找到一个教程:link text。但这是唯一的方法吗?如果不将Python对象编码到ByteArray中,就无法完成此操作。我需要一个非常简单的方法来解决我唯一的一类人。谢谢您。在


Tags: 数据对象方法模型应用程序标准层次结构排序
2条回答

好吧,我想我有一个可能的解决办法。在

请记住,我在这方面是一个完全的新手,所以不能保证他的a)作品b)是一个体面的解决方案c)不会让一个“真正的”程序员扔掉他们的午餐。在

我所做的是将特定项的整个祖先树转换为一个行列对的文本列表。(即列出被拖动项的行和列,其父项的行和列,其父项的行和列,等等。。。直到找到一个无效的索引-即根)

如下所示(此示例显示拖动的项有四个级别深):

2;0,1;0,5;0,1,0
^   ^   ^   ^
|   |   |   |
|   |   |   great grandparent (and child of the root item)
|   |   |
|   |   grandparent
|   |
|   parent
|
item being dragged

稍后,在dropMimeData函数中,我反转列表(以便它从根目录向下读取被拖动的项),并一次构建一个索引,直到返回到最初拖动的项。在

下面是一些代码片段,这些代码可以让所有这些都起作用。同样,我不能保证这是一个好主意,只是它似乎可以工作,不需要将python对象序列化为ByteArray。在

希望这有帮助。在

^{pr2}$

不要试图通过重新划分底层python对象来实现拖放。如果拖动来自进程外部,这将不起作用;对于复制操作也不起作用(节点对象可能不能存在于树中的多个位置)。在

将拖放“移动”想象为三种操作:

  1. 将数据序列化为某个字节字符串
  2. 反序列化为新索引(或新索引)
  3. (可选:如果“移动”而不是“复制”)删除旧索引

mineData()和dropMimeData()是您提供的序列化和反序列化操作。Python提供了一些实现它们的简单方法检查pickle模块的文档。如果你幸运的话,泡菜、垃圾()和酸洗负荷()会为你开箱即用的。在

编辑:我不知道如何在注释中粘贴代码,所以下面是我的注释所指的解决方案。这是安全的,从某种意义上说,如果您碰巧违反了规则,它将通过抛出KeyError而不是导致崩溃而失败。在

# drag: store off the data in a safe place, and serialize a cooky
# that the drop target can use to retrieve the data.
self.__tmp_storage_dct = { self.__tmp_storage_cooky: stuff }
m.setData(self.rowlistptr_mime_type, QByteArray(pickle.dumps(self.__tmp_storage_cooky)))
self.__tmp_storage_cooky += 1

# drop:
if mime.hasFormat(self.rowlistptr_mime_type):
  print "got tmpstorage"
  cooky = pickle.loads(mime.data(self.rowlistptr_mime_type).data())
  nodes = self.__tmp_storage_dct.pop(cooky)

相关问题 更多 >