QTreeWidget 是 Qt 框架中用于显示树形结构数据的控件,常用于展示层级关系(如文件目录、组织结构等)。以下是详细使用指南:
1. 基本用法
#include <QTreeWidget>
#include <QTreeWidgetItem>
// 创建树控件
QTreeWidget *treeWidget = new QTreeWidget(parent);
treeWidget->setColumnCount(2); // 设置列数
treeWidget->setHeaderLabels({"名称", "类型"}); // 设置列标题
// 添加顶层项
QTreeWidgetItem *rootItem = new QTreeWidgetItem(treeWidget);
rootItem->setText(0, "根节点");
rootItem->setIcon(0, QIcon(":/icons/root.png"));
// 添加子项
QTreeWidgetItem *childItem = new QTreeWidgetItem(rootItem);
childItem->setText(0, "子节点");
childItem->setCheckState(0, Qt::Checked); // 添加复选框
// 展开所有节点
treeWidget->expandAll();
2. 核心功能
列设置:
treeWidget->setColumnWidth(0, 200); // 设置列宽 treeWidget->setColumnHidden(1, true); // 隐藏第二列
数据存储:
// 存储自定义数据(任意QVariant类型) item->setData(0, Qt::UserRole, QVariant(123)); // 获取数据 int value = item->data(0, Qt::UserRole).toInt();
排序:
treeWidget->setSortingEnabled(true); treeWidget->sortByColumn(0, Qt::AscendingOrder);
3. 信号处理
// 项选择变化
connect(treeWidget, &QTreeWidget::itemSelectionChanged, [=](){
qDebug() << "当前选中项:" << treeWidget->currentItem()->text(0);
});
// 项双击事件
connect(treeWidget, &QTreeWidget::itemDoubleClicked, [](QTreeWidgetItem *item, int column){
qDebug() << "双击:" << item->text(column);
});
4. 高级操作
- 遍历节点:
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
if ((*it)->text(0) == "目标节点") {
// 找到目标处理
}
++it;
}
- 上下文菜单:
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(treeWidget, &QTreeWidget::customContextMenuRequested, [=](const QPoint &pos){
QMenu menu;
menu.addAction("删除", [=](){ /* 删除操作 */ });
menu.exec(treeWidget->viewport()->mapToGlobal(pos));
});
5. 性能优化
当数据量较大时:
- 使用
setUniformRowHeights(true)
提升渲染性能 - 批量操作时先调用
setUpdatesEnabled(false)
- 考虑使用 Model/View 模式的 QTreeView + QFileSystemModel
完整示例(省市选择树)
QTreeWidget *areaTree = new QTreeWidget;
areaTree->setHeaderLabel("中国行政区划");
// 添加省级节点
QStringList provinces = {"北京市", "江苏省", "广东省"};
foreach (const QString &province, provinces) {
QTreeWidgetItem *provItem = new QTreeWidgetItem(areaTree);
provItem->setText(0, province);
// 添加市级节点
if (province == "江苏省") {
QStringList cities = {"南京市", "苏州市", "无锡市"};
foreach (const QString &city, cities) {
QTreeWidgetItem *cityItem = new QTreeWidgetItem(provItem);
cityItem->setText(0, city);
}
}
}
// 显示树控件
areaTree->expandAll();
areaTree->show();
注意事项
- 内存管理:QTreeWidgetItem 需要手动删除或设置父对象自动管理
- 大数据量推荐使用 Model/View 架构
- 可通过 QTreeWidgetItem 的 setFlags() 控制节点行为(可编辑、可选中等)
通过合理使用这些功能,可以创建出功能丰富的树形界面组件,适用于配置界面、文件浏览器、数据导航等多种场景。