在QTreeView中顯示EDS文件的部分內容

使用開源的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_()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章