TreeWidget插入节点利用的是下面这两个函数 ,第一个参数是在哪个节点或者TreeWidget下面插入节点。第二个参数就是在哪个节点后面插入一个节点,如果为空,就在最上面插入节点。
QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, int type = Type);
QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, int type = Type);
实例程序如下:
QTreeWidget* treeWidget = new QTreeWidget();// 新建一个treeWidget,也可以拖拽
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(treeWidget);
ui->centralwidget->setLayout(layout);
treeWidget->setColumnCount(2);// 设置列数
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);// 不可少否则右键无反应
connect(treeWidget, &QTreeWidget::customContextMenuRequested,
[=](const QPoint&)
{
QDateTime dateTime= QDateTime::currentDateTime();// 获取系统当前的时间,只为了直观显示
QString dateTimeQSt = dateTime.toString("hh:mm:ss");
QMenu* menu = new QMenu(treeWidget);// 弹出的菜单对象
QTreeWidgetItem* currentItem = treeWidget->currentItem();// 获取当前被点击的节点
if(currentItem == nullptr)// 右键的位置不在treeItem的范围内,还有一种情况是TreeWidget里面一个treeItem都没有
{
QAction* insertNewItemAction = new QAction("插入新节点", this);
connect(insertNewItemAction, &QAction::triggered, [=](){
QTreeWidgetItem* topItem = new QTreeWidgetItem(treeWidget, nullptr);
topItem->setText(0, "新的根节点" + dateTimeQSt);
});
menu->addAction(insertNewItemAction);// 添加一个菜单选项
menu->exec(QCursor::pos());// 菜单出现在鼠标当前位置
}
else
{
QAction* insertTopItemAction = new QAction("最上方插入节点", this);
connect(insertTopItemAction, &QAction::triggered, [=](){
if(currentItem->parent() == nullptr)// 判断是否是根节点
{
QTreeWidgetItem* topItem = new QTreeWidgetItem(treeWidget, nullptr);
topItem->setText(0, "新的根节点" + dateTimeQSt);
}
else
{
QTreeWidgetItem* topItem = new QTreeWidgetItem(currentItem->parent(), nullptr);
topItem->setText(1, "新的子节点" + dateTimeQSt);
}
});
menu->addAction(insertTopItemAction);// 添加一个菜单选项
QAction* insertDownItemAction = new QAction("下方插入一个节点", this);
connect(insertDownItemAction, &QAction::triggered, [=](){
if(currentItem->parent() == nullptr)// 判断是否是根节点
{
QTreeWidgetItem* topItem = new QTreeWidgetItem(treeWidget, currentItem);
topItem->setText(0, "新的根节点" + dateTimeQSt);
}
else
{
QTreeWidgetItem* topItem = new QTreeWidgetItem(currentItem->parent(), currentItem);
topItem->setText(1, "新的子节点" + dateTimeQSt);
}
});
QAction* deleteItemAction = new QAction("删除当前节点", this);
connect(deleteItemAction, &QAction::triggered, [=](){
delete currentItem;
});
menu->addAction(insertDownItemAction);// 添加一个菜单选项
if(currentItem->parent() == nullptr)// 如果是根节点可以插入子节点
{
QAction* insertChildItemAction = new QAction("插入子节点", this);
connect(insertChildItemAction, &QAction::triggered, [=](){
QTreeWidgetItem* topItem = new QTreeWidgetItem(currentItem);
topItem->setText(1, "新的子节点" + dateTimeQSt);
});
menu->addAction(insertChildItemAction);
}
menu->addAction(deleteItemAction);// 添加一个菜单选项
menu->exec(QCursor::pos());// 菜单出现在鼠标当前位置
}
});
使用lambda表达可以减少函数的定义,编写方便,但可能会产生引用悬挂问题。QT6会出现警告,原因是lambda表达式捕获上下文对象,可能发生引用悬挂导致程序奔溃,编写时最好按值捕获。