QT TreeWidget右键弹出菜单插入节点(connect函数+lambda表达式)

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表达式捕获上下文对象,可能发生引用悬挂导致程序奔溃,编写时最好按值捕获。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值