Qt控件:Item Views/Widgets
Item
- 1. Item Views(Model-Based)
- 1.1 List View
- 2. Item Widgets(Item-Based)
- 2.1 List Widget
- 1. 基本使用步骤
- 2. 添加树形项(节点)
- 3. 节点常用设置
- 4. 信号与槽(交互处理)
- 5. 其他常用操作
- 5. 示例代码
1. Item Views(Model-Based)
1.1 List View
2. Item Widgets(Item-Based)
2.1 List Widget
QTreeWidget
是 Qt 中用于显示树形结构数据的控件,基于项(QTreeWidgetItem
)构建,适合展示具有层级关系的数据(如文件目录、组织架构等)。以下是其核心用法:
1. 基本使用步骤
-
步骤1:在UI中添加或代码创建QTreeWidget
UI设计器:直接拖放QTreeWidget
到窗口。
代码创建:#include <QTreeWidget> #include <QTreeWidgetItem>// 创建树控件 QTreeWidget *treeWidget = new QTreeWidget(this); treeWidget->setGeometry(50, 50, 400, 300); // 位置和大小
-
步骤2:设置列标题(可选,适用于多列树)
// 设置列数和标题(单列树可省略)
treeWidget->setColumnCount(2); // 2列
QStringList headers;
headers << "名称" << "描述";
treeWidget->setHeaderLabels(headers);
2. 添加树形项(节点)
- 添加顶层节点(根节点)
// 创建顶层项(父节点为nullptr)
QTreeWidgetItem *parentItem = new QTreeWidgetItem(treeWidget);
parentItem->setText(0, "顶层节点1"); // 第0列文本
parentItem->setText(1, "这是顶层节点"); // 第1列文本// 或通过addTopLevelItem添加
QTreeWidgetItem *parentItem2 = new QTreeWidgetItem();
parentItem2->setText(0, "顶层节点2");
treeWidget->addTopLevelItem(parentItem2);
- 添加子节点
// 为parentItem添加子节点
QTreeWidgetItem *childItem1 = new QTreeWidgetItem(parentItem);
childItem1->setText(0, "子节点1-1");
childItem1->setText(1, "第一个子节点");QTreeWidgetItem *childItem2 = new QTreeWidgetItem(parentItem);
childItem2->setText(0, "子节点1-2");
childItem2->setText(1, "第二个子节点");// 子节点也可以有自己的子节点(多级嵌套)
QTreeWidgetItem *grandChild = new QTreeWidgetItem(childItem1);
grandChild->setText(0, "孙节点");
3. 节点常用设置
- 设置图标
// 为节点设置图标(需先准备QIcon)
parentItem->setIcon(0, QIcon(":/icons/folder.png")); // 第0列图标
childItem1->setIcon(0, QIcon(":/icons/file.png"));
- 设置复选框
// 启用复选框
parentItem->setCheckState(0, Qt::Unchecked); // 第0列显示复选框,初始未选中
childItem1->setCheckState(0, Qt::Checked);// 获取复选状态
if (childItem1->checkState(0) == Qt::Checked) {// 处理选中状态
}
- 设置可编辑
// 允许双击编辑节点文本
treeWidget->setEditTriggers(QAbstractItemView::DoubleClicked);
// 或单个节点设置
childItem1->setFlags(childItem1->flags() | Qt::ItemIsEditable);
4. 信号与槽(交互处理)
常用信号:
itemClicked(QTreeWidgetItem*, int)
:节点被点击时触发itemDoubleClicked(QTreeWidgetItem*, int)
:节点被双击时触发itemChanged(QTreeWidgetItem*, int)
:节点内容(如复选框)变化时触发
示例:
// 连接节点点击信号
connect(treeWidget, &QTreeWidget::itemClicked, this, [=](QTreeWidgetItem *item, int column) {QString text = item->text(0); // 获取点击节点第0列文本qDebug() << "点击了:" << text;
});// 连接复选框变化信号
connect(treeWidget, &QTreeWidget::itemChanged, this, [=](QTreeWidgetItem *item, int column) {if (item->checkState(0) == Qt::Checked) {qDebug() << item->text(0) << "被选中";}
});
5. 其他常用操作
- 展开/折叠节点
treeWidget->expandAll(); // 展开所有节点
treeWidget->collapseAll(); // 折叠所有节点
parentItem->setExpanded(true); // 单独展开某个节点
- 获取选中节点
// 获取当前选中的节点(单个)
QTreeWidgetItem *selectedItem = treeWidget->currentItem();
if (selectedItem) {qDebug() << "当前选中:" << selectedItem->text(0);
}// 获取所有选中的节点(需开启多选模式)
treeWidget->setSelectionMode(QAbstractItemView::MultiSelection);
QList<QTreeWidgetItem*> selectedItems = treeWidget->selectedItems();
- 删除节点
// 删除指定节点(父节点的takeChild方法)
int index = parentItem->indexOfChild(childItem1);
delete parentItem->takeChild(index);// 清空所有节点
treeWidget->clear();
5. 示例代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("QTreeWidget示例");// 创建树控件QTreeWidget *treeWidget = new QTreeWidget(this);treeWidget->setGeometry(20, 20, 500, 400);// 设置列标题treeWidget->setColumnCount(2);treeWidget->setHeaderLabels(QStringList() << "项目" << "信息");// 添加顶层节点QTreeWidgetItem *root1 = new QTreeWidgetItem(treeWidget);root1->setText(0, "文件夹A");root1->setIcon(0, QIcon(":/icons/folder.png"));QTreeWidgetItem *root2 = new QTreeWidgetItem(treeWidget);root2->setText(0, "文件夹B");root2->setIcon(0, QIcon(":/icons/folder.png"));// 添加子节点QTreeWidgetItem *child1 = new QTreeWidgetItem(root1);child1->setText(0, "文件1.txt");child1->setText(1, "文本文件");child1->setIcon(0, QIcon(":/icons/file.png"));child1->setCheckState(0, Qt::Unchecked);QTreeWidgetItem *child2 = new QTreeWidgetItem(root1);child2->setText(0, "文件2.jpg");child2->setText(1, "图片文件");child2->setIcon(0, QIcon(":/icons/image.png"));child2->setCheckState(0, Qt::Unchecked);// 展开所有节点treeWidget->expandAll();// 连接点击信号connect(treeWidget, &QTreeWidget::itemClicked, this, [=](QTreeWidgetItem *item, int column) {qDebug() << "点击了:" << item->text(0) << ",列:" << column;});
}MainWindow::~MainWindow()
{delete ui;
}
QTreeWidget
适合快速构建树形界面,通过 QTreeWidgetItem
管理节点,支持多级嵌套、图标、复选框等功能。若需更灵活的数据模型(如动态数据或自定义结构),可考虑使用 QTreeView
+ QAbstractItemModel
组合,而 QTreeWidget
更适合简单场景。