标题:遗留了很久的功能终于搞定/QTreeWidget自定义节点/添加删除修改分组
作者:liudianwu
日期:2025-01-05 09:22
内容:
## 一、前言说明
这个功能看起来简单,实际上也确实简单,以前没搞的时候还以为很难,难点就是如何存储这个任意层级的树状列表信息,近期大环境经济很差,刚好有空把这个功能搞定,其实二维表格的方式存储这种任意层级树结构就可以,就是子节点需要指定父节点,父节点为空表示顶层节点,最开始还考虑搞个数据库表来存储,后面发现用ini配置文件就行,ini直接支持QStringList的读取和写入,以前还傻哔哔的用QString存储用splite分割,原来ini默认就支持,根本无需特殊处理。
这里面有个要点就是删除分组,如果没有子节点,直接删除当前节点的所有子节点用qDeleteAll(treeItem->takeChildren()),但是他只是删除的所有子节点,当前节点并不会删除,需要用QTreeWidgetItem的takeChild函数,还有个问题就是当前是顶层节点,需要换成treeWidget->takeTopLevelItem。关于所有设备树的操作,有很多个地方需要,所以单独新建了一个类devicetree处理这些,都是静态函数,比如获取对应节点所有子节点的媒体地址、选中媒体地址对应节点、初始化和保存最后展开的节点、初始化树控件、初始化父节点、初始化子节点、隐藏空子节点、初始化树节点、保存节点数据等。
1. 添加分组、删除分组、修改分组
2. 多层级加载设备列表,分组和设备图标不一样,NVR和分组也不一样
3. 添加NVR自动添加分组
4. 过滤没有子设备的分组
5. 放大字体,有些年纪大的领导说字体要放大,显示码流节点
6. 搜索设备
## 二、效果图
## 三、相关代码
```cpp
QStringList DeviceTree::getTreeText(QTreeWidget *treeWidget)
{
QStringList texts;
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
QTreeWidgetItem *item = (*it);
++it;
texts text(0);
}
return texts;
}
QTreeWidgetItem *DeviceTree::getTreeItem(QTreeWidget *treeWidget, const QString &text)
{
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
& ..