- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
QTreeWidget基础概念
QTreeWidget
是 Qt 中一个功能强大的树状控件,适用于显示和管理分层数据。它内置了一个标准的模型(QTreeWidgetItem
),使得数据的添加、删除和管理变得更加简单。
使用场景
- 显示和管理分层数据,如文件系统、组织结构等。
- 需要多列显示数据时。
- 需要对数据进行分组和分类展示时。
常见样式
- 带表头的树:显示树状结构的同时显示表头。
- 隐藏表头的树:隐藏表头,只显示树状结构。
- 交替行颜色的树:行背景颜色交替显示,提升可读性。
QTreeWidget属性设置
显示属性
- headerHidden :是否隐藏表头。设置为
true
将隐藏表头,默认为false
。 - columnCount:列的数量。可以设置树控件的列数。
- alternatingRowColors :交替行颜色。设置为
true
时,行背景颜色将交替显示。 - rootIsDecorated :是否显示根节点的装饰。设置为
true
时,根节点前会有展开/折叠的标志,默认为true
。 - sortingEnabled :是否启用排序。设置为
true
时,可以对列进行排序。
交互属性
- editTriggers:编辑触发器,决定哪些操作可以触发编辑。例如,双击、单击等。
- selectionBehavior:选择行为,决定是选择行、列还是单个单元格。
- selectionMode:选择模式,决定可以选择的项目数,例如单选、多选等。
- columnWidth:列宽度。可以为每一列设置固定的宽度。
- indentation:缩进。设置子项相对于父项的缩进级别。
- uniformRowHeights :是否统一行高。设置为
true
时,所有行将具有相同的高度。 - itemsExpandable :项目是否可展开。设置为
true
时,节点可以被展开和折叠。
QTreeWidget常见操作
初始化和设置
创建和配置树控件
cpp
QTreeWidget *treeWidget = new QTreeWidget(this);
treeWidget->move(200, 200);
treeWidget->resize(300, 300);
treeWidget->setColumnCount(2);
treeWidget->setHeaderLabels(QStringList() << "Name" << "Details");
treeWidget->setAlternatingRowColors(true);
treeWidget->setRootIsDecorated(true);
treeWidget->setSortingEnabled(true);
设置表头
cpp
treeWidget->setHeaderHidden(false);
treeWidget->setHeaderLabels(QStringList() << "Column 1" << "Column 2");
数据操作
添加顶层项
cpp
QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(treeWidget);
topLevelItem->setText(0, "Top Level Item");
treeWidget->addTopLevelItem(topLevelItem);
插入顶层项
cpp
QTreeWidgetItem *insertedItem = new QTreeWidgetItem;
insertedItem->setText(0, "Inserted Item");
treeWidget->insertTopLevelItem(1, insertedItem);
获取和移除顶层项
cpp
QTreeWidgetItem *item = treeWidget->takeTopLevelItem(0);
delete item;
选择和当前项
获取和设置当前项
cpp
QTreeWidgetItem *currentItem = treeWidget->currentItem();
treeWidget->setCurrentItem(currentItem);
获取选中的项
cpp
QList<QTreeWidgetItem*> selectedItems = treeWidget->selectedItems();
展开和折叠
展开和折叠项
cpp
treeWidget->expandItem(topLevelItem);
treeWidget->collapseItem(topLevelItem);
查找和遍历
查找包含指定文本的项
cpp
QList<QTreeWidgetItem*> foundItems = treeWidget->findItems("Search Text", Qt::MatchContains, 0);
获取指定位置的项
cpp
QTreeWidgetItem *item = treeWidget->itemAt(10, 10);
获取项的模型索引
cpp
QModelIndex index = treeWidget->indexFromItem(topLevelItem, 0);
QTreeWidgetItem *itemFromIndex = treeWidget->itemFromIndex(index);
清空和删除
清空所有项
cpp
treeWidget->clear();
移除指定项的控件
cpp
treeWidget->removeItemWidget(topLevelItem, 0);
QTreeWidget信号和槽
常用信号
项被点击
cpp
connect(treeWidget, &QTreeWidget::itemClicked, this, [](QTreeWidgetItem *item, int column) {
qDebug() << "Item clicked:" << item->text(column);
});
项被双击
cpp
connect(treeWidget, &QTreeWidget::itemDoubleClicked, this, [](QTreeWidgetItem *item, int column) {
qDebug() << "Item double clicked:" << item->text(column);
});
选择项发生变化
cpp
connect(treeWidget, &QTreeWidget::itemSelectionChanged, this, []() {
qDebug() << "Selection changed";
});
项展开和折叠
cpp
connect(treeWidget, &QTreeWidget::itemExpanded, this, [](QTreeWidgetItem *item) {
qDebug() << "Item expanded:" << item->text(0);
});
connect(treeWidget, &QTreeWidget::itemCollapsed, this, [](QTreeWidgetItem *item) {
qDebug() << "Item collapsed:" << item->text(0);
});
示例代码
cpp
void InitTreeWidget()
{
//设置表头数
ui->treeWidget->setColumnCount(2);
//设置表头项
QStringList treeHead;
treeHead << "班级" << "课程";
ui->treeWidget->setHeaderLabels(treeHead);
//根节点
QTreeWidgetItem* root1 = new QTreeWidgetItem;
QTreeWidgetItem* root2 = new QTreeWidgetItem;
//子节点
QTreeWidgetItem* child11 = new QTreeWidgetItem;
QTreeWidgetItem* child12 = new QTreeWidgetItem;
QTreeWidgetItem* child21 = new QTreeWidgetItem;
child11->setText(0, "张三");
child11->setText(1, "FPS");
child12->setText(0, "李四");
child12->setText(1, "RPG");
child21->setText(0, "王五");
child21->setText(1, "MacOs");
root1->setText(0, "游戏防护");
root2->setText(0, "系统安全");
//关联子节点
root1->addChild(child11);
root1->addChild(child12);
root2->addChild(child21);
//设置根节点
ui->treeWidget->addTopLevelItem(root1);
ui->treeWidget->addTopLevelItem(root2);
//数量索引
qDebug() << "RootCount" << ui->treeWidget->topLevelItemCount();
qDebug() << "Root1ChildCount" << root1->childCount();
qDebug() << "Root1ChildCount" << root2->childCount();
qDebug() << "IndexOfChild" << root1->indexOfChild(child11);
qDebug() << "IndexOfChild" << root1->indexOfChild(child12);
//删除操作
//ui->treeWidget->takeTopLevelItem(0);
//root1->takeChild(0);
ui->treeWidget->expandItem(root1);
qDebug() << "isItemExpand" << ui->treeWidget->isItemExpanded(root1);
}