qt QTreeWidget`总结


1. 基本概念

  • 作用:用于显示树形结构的数据(如文件目录、层级菜单)。
  • 核心组件 :
    • QTreeWidget:树形控件容器。
    • QTreeWidgetItem:树形控件中的节点(可包含子节点)。

2. 基本用法

创建树控件
cpp 复制代码
QTreeWidget *treeWidget = new QTreeWidget(parent);
treeWidget->setColumnCount(2); // 设置列数
treeWidget->setHeaderLabels({"Name", "Value"}); // 设置表头
添加根节点和子节点
cpp 复制代码
// 添加根节点
QTreeWidgetItem *rootItem = new QTreeWidgetItem(treeWidget);
rootItem->setText(0, "Root");
rootItem->setData(0, Qt::UserRole, "CustomData"); // 存储自定义数据

// 添加子节点
QTreeWidgetItem *childItem = new QTreeWidgetItem(rootItem);
childItem->setText(0, "Child");
childItem->setCheckState(0, Qt::Checked); // 添加复选框
设置节点属性
cpp 复制代码
// 设置图标、字体、颜色等
childItem->setIcon(0, QIcon(":/icon.png"));
childItem->setForeground(0, QBrush(Qt::red));
childItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled); // 允许编辑

3. 常用方法

数据操作
方法 描述
addTopLevelItem(QTreeWidgetItem*) 添加根节点
insertTopLevelItem(int index, QTreeWidgetItem*) 插入根节点到指定位置
takeTopLevelItem(int index) 移除根节点(不删除对象)
clear() 清空所有节点
currentItem() 获取当前选中节点
遍历节点
cpp 复制代码
// 遍历所有根节点
for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) {
    QTreeWidgetItem *item = treeWidget->topLevelItem(i);
    // 遍历子节点
    for (int j = 0; j < item->childCount(); ++j) {
        QTreeWidgetItem *child = item->child(j);
    }
}

4. 信号与事件

常用信号
  • itemClicked(QTreeWidgetItem*, int column):节点点击事件。
  • itemDoubleClicked(QTreeWidgetItem*, int column):节点双击事件。
  • itemChanged(QTreeWidgetItem*, int column):节点内容变化事件。
示例:响应点击事件
cpp 复制代码
connect(treeWidget, &QTreeWidget::itemClicked, [](QTreeWidgetItem *item, int col) {
    qDebug() << "点击节点:" << item->text(col);
});

5. 进阶功能

自定义排序
cpp 复制代码
// 按第一列文本排序
treeWidget->sortItems(0, Qt::AscendingOrder);
拖放支持
cpp 复制代码
treeWidget->setDragEnabled(true);
treeWidget->setAcceptDrops(true);
treeWidget->setDragDropMode(QAbstractItemView::InternalMove); // 内部拖放
样式定制
cpp 复制代码
// 使用 QSS 设置样式
treeWidget->setStyleSheet(
    "QTreeWidget { background: #f0f0f0; }"
    "QTreeWidget::item:hover { background: yellow; }"
);
与数据模型结合
  • 对于复杂数据,可继承 QAbstractItemModel 使用 QTreeView,但 QTreeWidget 更适用于简单场景。

6. 示例代码

cpp 复制代码
// 创建树控件
QTreeWidget *tree = new QTreeWidget(this);
tree->setColumnCount(2);
tree->setHeaderLabels({"Category", "Status"});

// 添加根节点
QTreeWidgetItem *root = new QTreeWidgetItem(tree);
root->setText(0, "Animals");
root->setExpanded(true); // 默认展开

// 添加子节点
QTreeWidgetItem *child1 = new QTreeWidgetItem(root);
child1->setText(0, "Dog");
child1->setText(1, "Alive");

QTreeWidgetItem *child2 = new QTreeWidgetItem(root);
child2->setText(0, "Dinosaur");
child2->setText(1, "Extinct");

7. 注意事项

  1. 性能优化 :大量节点时建议使用 QTreeView + QStandardItemModel。
  2. 内存管理 :手动创建的 QTreeWidgetItem 需要手动删除(或设为子对象自动释放)。
  3. 线程安全:UI 操作需在主线程执行,多线程中通过信号槽更新数据。
  4. 数据存储 :使用 setData() 和 data() 存储自定义数据,而非直接依赖文本。

掌握上述内容后,可以快速实现树形结构数据的展示与交互,并根据需求扩展高级功能(如动态加载、上下文菜单等)。

相关推荐
wespaul2 小时前
VeapAI 自然语言操作实战|第 05 篇:向量与召回——从知识条目到可检索资产
大数据·数据库·人工智能·milvus
蹊黎3 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
一只鹿鹿鹿8 小时前
政务外网整体设计方案(PPT)
大数据·数据库·web安全·系统安全·流程图·政务
2603_965148118 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
AI砖家8 小时前
安全进入 Agent Loop:2027 年 Coding Agent 的决胜点
数据库·安全·codex·vibecoding
wangqiaowq8 小时前
SQL server C盘空间占满的处理
数据库·sql
文人sec8 小时前
SQL基础入门笔记 | 从零基础到掌握核心查询语句
数据库·笔记·sql
数字新视界8 小时前
机房动环监控提升运维效率
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
程序猿追9 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓9 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言