QTreewidget的使用
1 QtreeWidget显示右键菜单
#include "treewidget.h" #include <QPushButton> #include <QMenu> TreeWidget::TreeWidget(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); //设置树形控件每一列的名称 QStringList sl; sl << u8"名称"; ui.treeWidget->setHeaderLabels(sl); //treewidget鼠标右键菜单事件,需要在代码手动设置ContextMenuPolicy属性或者在ui文件中设置 ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui.treeWidget, &QWidget::customContextMenuRequested, this, &TreeWidget::ShowContextMenu); //为树形控件添加一级结点 connect(ui.add_first_node_button, &QPushButton::clicked, this, &TreeWidget::AddFirstNode); //为树形控件添加二级结点 connect(ui.add_second_node_button, &QPushButton::clicked, this, &TreeWidget::AddSecondNode); } void TreeWidget::ShowContextMenu(const QPoint &pos) { QMenu *menu = new QMenu(this); QTreeWidgetItem *item = ui.treeWidget->itemAt(pos); if (item) { if ((int)TreeItemType::kFisrtNode == item->type()) { QAction *action1 = new QAction(u8"一级结点1", this); menu->addAction(action1); QAction *action2 = new QAction(u8"一级结点2", this); menu->addAction(action2); QAction *action3 = new QAction(u8"一级结点3", this); menu->addAction(action3); } else if ((int)TreeItemType::kSecondNode == item->type()) { QAction *action1 = new QAction(u8"二级结点1", this); menu->addAction(action1); QAction *action2 = new QAction(u8"二级结点2", this); menu->addAction(action2); QAction *action3 = new QAction(u8"二级结点3", this); menu->addAction(action3); } } else { //在空白处点击,没有选中QTreeWidgetItem QAction *action1 = new QAction(u8"空白结点1", this); menu->addAction(action1); QAction *action2 = new QAction(u8"空白结点2", this); menu->addAction(action2); QAction *action3 = new QAction(u8"空白结点3", this); menu->addAction(action3); } menu->exec(QCursor::pos()); }
2 QtreeWidget添加结点
void TreeWidget::AddFirstNode() { QTreeWidgetItem *node = new QTreeWidgetItem(ui.treeWidget, (int)TreeItemType::kFisrtNode); QString text = QString::number(++node_sequence_); node->setText(0, text); ui.treeWidget->addTopLevelItem(node); } void TreeWidget::AddSecondNode() { QTreeWidgetItem *it = ui.treeWidget->currentItem(); if (!it) { return; } QTreeWidgetItem *item = new QTreeWidgetItem(it, (int)TreeItemType::kSecondNode); item->setText(0,u8"二级结点"); it->addChild(item); }
3 QtreeWidget删除结点
void TreeWidget::DeleteNode() { QTreeWidgetItem *item = ui.treeWidget->currentItem(); if (!item) { return; } if ((int)TreeItemType::kFisrtNode == item->type()) { int index = ui.treeWidget->indexOfTopLevelItem(item); ui.treeWidget->takeTopLevelItem(index); } else if ((int)TreeItemType::kSecondNode == item->type()) { ui.treeWidget->removeItemWidget(item, 0); delete item; } }
效果如下图:
代码源码下载(treewidget文件夹):git@github.com:Mr-jiayunfei/qt_code.git
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本