- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近花了一些时间研究如何在 PyQt 中使用带有 QTreeWidget 的 QDataStream。我从来没有找到具体的例子来做到这一点,而且 QDataStream 的 pyqt 文档一般来说似乎非常稀缺。所以我想我会在这里发布一个问题作为面包屑路径,以防其他人需要提示。我会稍等一下,以防有人愿意加入并试一试,我会尽我自己的努力回贴。
问题是:在 PyQt 中,如何使用 QDataStream 将 QTreeWidgetItems 作为 native QT 对象保存到文件中,然后读回文件以完全恢复保存时的树结构?
埃里克
最佳答案
在one of my other answers对于类似的问题,我写了一个序列化为 xml 的简单演示。
相同的代码可以很容易地适用于 QDataStream。我并不是真的推荐这个作为解决方案(可能有几十种不同的方法可以实现同样的事情),但它至少提供了一个工作示例:
import sip
sip.setapi('QString', 2)
from xml.etree import cElementTree as etree
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
def __init__(self, xml):
QtGui.QWidget.__init__(self)
self.tree = QtGui.QTreeWidget(self)
self.tree.header().hide()
self.button = QtGui.QPushButton('Export', self)
self.button.clicked[()].connect(self.exportTree)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.tree)
layout.addWidget(self.button)
self._array = QtCore.QByteArray()
self._buffer = QtCore.QBuffer(self._array, self)
self._buffer.open(QtCore.QIODevice.ReadWrite)
self._datastream = QtCore.QDataStream(self._buffer)
self.importTree(xml)
def importTree(self, xml):
def build(item, root):
for element in root.getchildren():
child = QtGui.QTreeWidgetItem(item)
data = element.attrib['data'].encode('ascii')
self._array.swap(self._array.fromBase64(data))
self._buffer.reset()
self._datastream >> child
build(child, element)
item.setExpanded(True)
root = etree.fromstring(xml)
build(self.tree.invisibleRootItem(), root)
def exportTree(self):
def build(item, root):
for row in range(item.childCount()):
child = item.child(row)
self._array.clear()
self._buffer.reset()
self._datastream << child
data = self._array.toBase64().data().decode('ascii')
element = etree.SubElement(root, 'node', data=data)
build(child, element)
root = etree.Element('root')
build(self.tree.invisibleRootItem(), root)
from xml.dom import minidom
print(minidom.parseString(etree.tostring(root)).toprettyxml())
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window("""\
<?xml version="1.0" ?>
<root>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB/////wAA
AAAAAAAAAAEAAAAKAAAAAAYAUgBlAGQ=">
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAP//
//8AAAAAAAEAAAAKAAAAAAgAQwB5AGEAbg==">
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAICA
AAAAAAAAAAEAAAAKAAAAAAoARwByAGUAZQBu"/>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAAAA
//8AAAAAAAEAAAAKAAAAAAgAQgBsAHUAZQ=="/>
</node>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB/////6Wl
AAAAAAAAAAEAAAAKAAAAAAwATwByAGEAbgBnAGU=">
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//+AgAAA
gIAAAAAAAAEAAAAKAAAAAAwAUAB1AHIAcABsAGU="/>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAICA
AAAAAAAAAAEAAAAKAAAAAAoARwByAGUAZQBu"/>
</node>
</node>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAP//
//8AAAAAAAEAAAAKAAAAAAgAQwB5AGEAbg==">
<node data="AAAAAQAAAAEAAAAJAAAAQwAB/////6Wl
AAAAAAAAAAEAAAAKAAAAAAwATwByAGEAbgBnAGU=">
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAP//
//8AAAAAAAEAAAAKAAAAAAgAQwB5AGEAbg=="/>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//+AgAAA
gIAAAAAAAAEAAAAKAAAAAAwAUAB1AHIAcABsAGU="/>
</node>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAICA
AAAAAAAAAAEAAAAKAAAAAAoARwByAGUAZQBu">
<node data="AAAAAQAAAAEAAAAJAAAAQwAB//8AAAAA
//8AAAAAAAEAAAAKAAAAAAgAQgBsAHUAZQ=="/>
<node data="AAAAAQAAAAEAAAAJAAAAQwAB/////wAA
AAAAAAAAAAEAAAAKAAAAAAYAUgBlAGQ="/>
</node>
</node>
</root>
""")
window.setGeometry(800, 300, 300, 300)
window.show()
sys.exit(app.exec_())
关于python - PyQt:使用 QDataStream 保存 native QTreeWidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653108/
我有一个相当奇怪的问题,使用 QDataStream,或者至少对我来说很奇怪,因为我根本不理解这种行为。 当然,我的问题来自一个大项目,但我设法用一个最小的例子重现了这种奇怪的行为,我现在将对此进行描
QFile msnLogFile(item->data(Qt::UserRole).toString()); QDataStream logDataStream; if(msnLogFile
我有一个包含两个主要模块的应用程序。一个是用 C 编写的,使用标准 C 运行时库,另一个是用 Qt C++ 编写的。它们通过 IPC 相互通信。 C 模块创建一个 char 数组,用数据填充它并发送到
我正在努力学习教程 here并序列化 Qt 对象。这是我的代码: QFile file("/Users/kaustav/Desktop/boo.dat"); if (!file.open(QIODev
我想将 QVector 序列化为 char* 数组。我通过以下代码执行此操作: QVector in; ... QByteArray bytes; QDataStream stream(&bytes,
我正在尝试保存 3 QVector和一个带有 QDataStream 的整数. 我重载了 operator #include #include class CloudData { public:
我正在尝试将特征向量序列化为 QDataStream: #include "utils.h" #include "Eigen/Eigen" int main(int argc, char *argv[
我正在用 Qt 实现一个小接口(interface)。在我目前正在处理的步骤中,我有 Scores(自定义类)我可以在只能容纳一个 Score 的 Docks(同样是自定义类)上移动。 我用这个例子启
假设我有一个创建 QIODevice(例如 QFile)的函数,然后返回一个指向从 QIODevice 构造的 QDataStream 的指针。在这里处理内存分配的最佳方法是什么?显然,QIODevi
我需要通过 QTcpSocket 接收二进制数据(读取浮点数)并使用 QDatastream 将它们写入 Qfile。但是我在使用 QDataStream 时遇到了一些问题。如下,我只能用这种方式来实
请考虑以下来自 QDataStream 的代码片段文档: QFile file("file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(
我目前正在尝试在我的代码中实现一个序列化系统,该系统将一个类型的多个对象存储在一个文件中。这非常有效,我通常只是使用 OpenMode QIODevice::Append 将它们一一附加。这里没有问题
我想将存储在 vector (保存结构)中的数据写入文件,并从该文件读取数据。我尝试使用 QDataStream 并重载“>>”和“ &data) { for(uint8_t i=0; i >
我想为抽象类重载 class AbstractBaseClass { public: AbstractBaseClass(); int BaseFirstField() const;
我正在尝试在 QTcpSocket 上发送一个 QByteArray 。我面临的问题是,虽然我发送了一个长度为 25 的数组,但在服务器上它收到了 59 个字节。这是我的示例代码: //client
这是一个关于在 C++ 和 Linux 中使用 QDataStream 和 QTemporaryFile 的 QT 问题。 我在刷新 QDataStream 时遇到了一些问题。 QTextStream
我正在 Qt 中编写一个简单的基于 TCP 的网络应用程序并想使用 QDataStream和 QByteArray通过网络发送数据。问题是当我将数据放入 QByteArray 时他们被“归零”了。例如
我有来自 tcp 套接字的数据作为原始数据(我有指定的格式),然后基于该数据创建一个对象。格式是这样的:24 字节的 header [数据大小和一些其他信息],然后是 header 中指定的数据量。
我有一个文件,假设长度为 8 个字节。例如它看起来像这样: 22222222 现在,我先读取 5 个字节并更改它们。对于前。到 11111 最后,我想将它们写入 ONTO EXCISTING DATA
根据本网站上的各种答案,我尝试定义自己的模板函数以将任何枚举值写入 QDataStream。 template ::value>> QDataStream &operator>(enumValue);
我是一名优秀的程序员,十分优秀!