擅长:python、mysql、java
<p>不要试图通过重新划分底层python对象来实现拖放。如果拖动来自进程外部,这将不起作用;对于复制操作也不起作用(节点对象可能不能存在于树中的多个位置)。在</p>
<p>将拖放“移动”想象为三种操作:</p>
<ol>
<li>将数据序列化为某个字节字符串</li>
<li>反序列化为新索引(或新索引)</li>
<li>(可选:如果“移动”而不是“复制”)删除旧索引</li>
</ol>
<p>mineData()和dropMimeData()是您提供的序列化和反序列化操作。Python提供了一些实现它们的简单方法检查pickle模块的文档。如果你幸运的话,泡菜、垃圾()和酸洗负荷()会为你开箱即用的。在</p>
<p>编辑:我不知道如何在注释中粘贴代码,所以下面是我的注释所指的解决方案。这是安全的,从某种意义上说,如果您碰巧违反了规则,它将通过抛出KeyError而不是导致崩溃而失败。在</p>
<pre><code># 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)
</code></pre>