在QTreeView中显示EDS文件的部分内容

10 篇文章 4 订阅
9 篇文章 6 订阅

使用开源的CANopen for Python可以轻松的读取EDS文件中的内容,在此以从零开始新建符合CiA DS301的对象字典EDS文件中创建的EDS文件作为示例,加载后的效果如下图所示:
这里写图片描述
因为代码非常简单,在此仅贴出代码而不作说明,代码如下:


import canopen
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTreeView)
from PyQt5.QtCore import (QModelIndex, Qt, QVariant, pyqtSignal)
from PyQt5.QtGui import (QStandardItem, QStandardItemModel)


DATA_TYPE = {
    0x1: 'BOOLEAN',
    0x2: 'INTEGER8',
    0x3: 'INTEGER16',
    0x4: 'INTEGER32',
    0x5: 'UNSIGNED8',
    0x6: 'UNSIGNED16',
    0x7: 'UNSIGNED32',
    0x8: 'REAL32',
    0x9: 'VISIBLE_STRING',
    0xA: 'OCTET_STRING',
    0xB: 'UNICODE_STRING',
    0xF: 'DOMAIN',
    0x11: 'REAL64',
    0x15: 'INTEGER64',
    0x1B: 'UNSIGNED64',
}


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow,self).__init__(parent)
        treeView = QTreeView()
        self.setCentralWidget(treeView)
        standardModel = QStandardItemModel()
        standardModel.setHorizontalHeaderLabels(('索引', '名称', '数值', '最小值', '最大值', '数据类型', '访问性'))
        network = canopen.Network()
        node = network.add_node(1, 'DS301.eds')
        item = standardModel.invisibleRootItem()

        for obj in node.object_dictionary.values():
            tmp = [QStandardItem(hex(obj.index)),
                   QStandardItem(obj.name),
                   QStandardItem(str(obj.default) if hasattr(obj, 'default') else None),
                   QStandardItem(str(obj.min) if hasattr(obj, 'min') else None),
                   QStandardItem(str(obj.max) if hasattr(obj, 'max') else None),
                   QStandardItem(DATA_TYPE.get(obj.data_type if hasattr(obj, 'data_type') else None)),
                   QStandardItem(obj.access_type if hasattr(obj, 'access_type') else None),
                   ]
            item.appendRow(tmp)
            if isinstance(obj, canopen.objectdictionary.Record):
                for subobj in obj.values():
                    tmp[0].appendRow([QStandardItem(hex(subobj.subindex)),
                                      QStandardItem(subobj.name),
                                      QStandardItem(str(subobj.default)),
                                      QStandardItem(str(subobj.min)),
                                      QStandardItem(str(subobj.max)),
                                      QStandardItem(DATA_TYPE.get(subobj.data_type)),
                                      QStandardItem(subobj.access_type),
                                      ])
            elif isinstance(obj, canopen.objectdictionary.Array):
                tmp[0].appendRow(None)

        treeView.setModel(standardModel)
        treeView.expandAll()


if __name__ == '__main__':
    a = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    a.exec_()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个递归显示XML文件的完整例子,它使用QXmlStreamReader解析XML文件,将其转换为QStandardItemModel,并将该模型设置为QTreeView的模型。它还使用递归方法来处理XML文件的嵌套。 ```cpp #include <QApplication> #include <QTreeView> #include <QStandardItemModel> #include <QXmlStreamReader> #include <QFile> // Recursive function to process XML elements void processXml(QStandardItem *parent, QXmlStreamReader &xml) { while (!xml.atEnd()) { xml.readNext(); if (xml.isStartElement()) { QStandardItem *nameItem = new QStandardItem(xml.name().toString()); QStandardItem *valueItem = new QStandardItem(xml.readElementText()); parent->appendRow(QList<QStandardItem*>() << nameItem << valueItem); processXml(nameItem, xml); } else if (xml.isEndElement()) { break; } } } int main(int argc, char *argv[]) { QApplication a(argc, argv); // Create a standard item model QStandardItemModel model; model.setHorizontalHeaderLabels(QStringList() << "Name" << "Value"); // Parse the XML file QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return -1; } QXmlStreamReader xml(&file); while (!xml.atEnd()) { xml.readNext(); if (xml.isStartElement()) { QStandardItem *nameItem = new QStandardItem(xml.name().toString()); QStandardItem *valueItem = new QStandardItem(xml.readElementText()); model.appendRow(QList<QStandardItem*>() << nameItem << valueItem); processXml(nameItem, xml); } } // Create a tree view and set the model QTreeView treeView; treeView.setModel(&model); treeView.expandAll(); treeView.resize(400, 300); treeView.show(); return a.exec(); } ``` 在这个例子,我们首先创建了一个QStandardItemModel,并设置了表头标签。然后,我们打开example.xml文件,并使用QXmlStreamReader解析它。在解析XML文件时,我们创建了一个名为nameItem的QStandardItem,它包含XML元素的名称,以及一个名为valueItem的QStandardItem,它包含XML元素的值。然后,我们将这两个项目添加到模型,并使用递归方法processXml来处理嵌套的XML元素。 最后,我们创建一个QTreeView,将模型设置为它的模型,并展开所有的项目。最后,我们显示QTreeView
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值