版权声明: https://blog.csdn.net/jeremyjone/article/details/81013689
上一篇已经实现了小项目的界面,这一篇主要实现Tree的内容。
在学习编程语言的时候,记得老师在讲递归时最经典的两个例子:一个是文件夹的遍历,一个是扫雷。
遍历这玩意在tree中再合适不过,所以,往QTreeWidget中添加数据,就用递归实现。
递归没什么好说的,直接上,只是QTreeWidget的子项叫QTreeWidgetItem,每个子项都是一个QTreeWidgetItem,所以,
需要自定义json文件的key值为全局变量,方便使用:
TREE_NODE = "items" # json文件中子项key
TREE_NODE_NAME = "label" # 每项显示在tree中的名字的key
递归代码如下:
# 获取tree数据的递归函数,在取值时使用
def get_data(widget, data_list):
for data in data_list:
# 创建一个新的tree子项
new_widget = QtGui.QTreeWidgetItem(widget)
# 判断是否有label项,如果有,子项显示label名,如果没有,显示No Label
if data.has_key(u"label"):
new_widget.setText(0, data[TREE_NODE_NAME])
else:
new_widget.setText(0, "No Label")
# 把所有数据放到新创建的子项中
new_widget.setData(0, QtCore.Qt.UserRole, data)
# 判断是否有子项
if data.has_key(TREE_NODE):
get_data(new_widget, data[TREE_NODE])
有了这个函数,让QTreeWidget显示数据就很简单了
# 左边tree
self.tree = QtGui.QTreeWidget(self)
self.tree.setColumnCount(1)
self.tree.setHeaderHidden(1)
self.tree.setGeometry(QtCore.QRect(1, 1, 250, 500))
# 添加数据
# 首先创建tree的根,设置根名和根数据,然后调用递归循环出所有节点
root = QtGui.QTreeWidgetItem(self.tree)
root.setText(0, JSON_FILE[TREE_NODE_NAME])
root.setData(0, QtCore.Qt.UserRole, JSON_FILE)
get_data(root, JSON_FILE[TREE_NODE])
这样,左边的树结构就可以显示内容了
顺便设置一下右边table的格式
# 右边table
self.table = QtGui.QTableWidget(self)
# 设置table的行和列
self.table.setColumnCount(2)
self.table.setRowCount(6)
# 设置table的列标题
self.table.setHorizontalHeaderLabels(['title', 'value'])
self.table.setGeometry(QtCore.QRect(250, 1, 350, 500))
# 设置table的行、列标题是否显示
self.table.verticalHeader().setVisible(False)
self.table.horizontalHeader().setVisible(True)
至此,大体的格式就已经出现了。效果如下:
有了这样的基础,我们就可以考虑显示信息了。
在PySide中,信息的传递都是通过信号和槽来实现的,下一篇我们来实现它!