【发布时间】:2018-09-13 14:06:18
【问题描述】:
我想展示一个 OPC 服务器中的节点是如何组织的树形视图。我正在使用PyQt5 和opcua 来实现这一点。为了尝试代码,我使用了Prosys OPC UA Simulation Server,它运行良好。它看起来像这样:
但是,当我尝试将代码与 real publicly available servers 一起使用时,应用程序崩溃了。我相信这种情况正在发生,因为在真实服务器中现有节点的数量是巨大的,并且应用程序有很多要处理的。
所以我想知道是否有办法“按需”填充树。即,仅当用户单击某个节点时才查找子节点,以便只有应显示在屏幕上的节点才作为 QTreeWidget 对象中的项目出现。我不知道这是否可能,因为目前我正在一次完全填充树,而不仅仅是当用户要求查看某个节点的子节点时。
这是我当前的代码:
import sys
from opcua import Client
from PyQt5 import QtWidgets, QtGui
class Window(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.node_tree = QtWidgets.QTreeWidget()
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.node_tree)
self.setLayout(layout)
self.client = Client('opc.tcp://127.0.0.1:53530/UA/Sim')
self.client.connect()
self.root = self.client.get_root_node()
self.fill_tree(self.node_tree, self.root)
def fill_tree(self, group, node):
item = QtWidgets.QTreeWidgetItem(group, [str(node)])
children = node.get_children()
variables = node.get_variables()
for child in children:
if child in variables:
QtWidgets.QTreeWidgetItem(item, [str(child) + ' (variable)'])
else:
self.fill_tree(item, child)
def closeEvent(self,event):
self.client.disconnect()
sys.exit(0)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ex = Window()
ex.show()
sys.exit(app.exec_())
【问题讨论】:
-
我对OPC一无所知,但我想我可以帮助你,在我看来只有不是变量的子节点才能有子节点,对吗?
-
@eyllanesc 我不确定我理解你的意思。基本上:1)变量不能有孩子。 2) 任何其他节点(即任何不是变量的节点)可能有也可能没有子节点。
-
好的,我明白你的意思。从概念上讲,模型应该类似于 QFileSystemModel。
-
@eyllanesc 是的,现在你提到它几乎是一样的:文件是变量,文件夹是节点。
-
为什么添加:
self.client.disconnect()?断线后能拿到节点吗?
标签: python pyqt treeview pyqt5 qtreewidget