Qt treewidget右键添加菜单,删除节点

1、添加connect连接,实现信号与槽函数的连接,具体如下:

ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);   //使得该控件可以支持右键菜单

connect(ui.treeWidget, SIGNAL(customContextMenuRequested(const QPoint &)),
		this, SLOT(SlotCustomContextMenuRequested(const QPoint&)));//实现右击添加菜单的信号与槽的连接

2、实现槽函数--SlotCustomContextMenuRequested(const QPoint&),具体如下:

void Test_9::SlotCustomContextMenuRequested(const QPoint& pos)
{
	m_pact = new QAction(QStringLiteral("删除"), this);
	//QAction *pDelAction_1 = new QAction(QStringLiteral("重命名"), this);
	QMenu *popMenu = new QMenu(this);//定义右键弹出菜单
	popMenu->addAction(m_pact);//往菜单内添加QAction 
	// QAction *deleAction = cmenu->addAction("Delete");//另一种创建方式
	connect(m_pact, SIGNAL(triggered()), this, SLOT(DeleteItemFunction()));
	popMenu->exec(QCursor::pos());//弹出右键菜单,菜单位置为光标位置
}

3、实现单击删除节点槽函数--DeleteItemFunction(),具体如下:

void Test_9::DeleteItemFunction()
{
	QTreeWidgetItem * currentItem = ui.treeWidget->currentItem();//获取当前节点
	if (currentItem == NULL)
	{
		return;
	}
	else
		delete currentItem;
}

4、实现结果

                 

 5、完整代码如下:

(1)Test_9.cpp文件完整内容如下:

#include "Test_9.h"

Test_9::Test_9(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);   //使得该控件可以支持右键菜单

	connect(ui.treeWidget, SIGNAL(customContextMenuRequested(const QPoint &)),
		this, SLOT(SlotCustomContextMenuRequested(const QPoint&)));
	
	ui.treeWidget->setStyle(QStyleFactory::create("windows"));  //设置虚线和伸缩加减号
	ui.treeWidget->clear();    //QTreeWidget清空
	ui.treeWidget->setHeaderLabels(QStringList() << QStringLiteral("名称") << QStringLiteral("编号"));
	ui.treeWidget->setColumnCount(2); //tree widget的列数

	 //顶层节点设计
	QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList() << QStringLiteral("项目"));
	ui.treeWidget->addTopLevelItem(liItem);

	//子节点的设置
	QTreeWidgetItem * li1 = new QTreeWidgetItem(QStringList() << QStringLiteral("参数"));
	liItem->addChild(li1);
	QTreeWidgetItem * li2 = new QTreeWidgetItem(QStringList() << QStringLiteral("几何"));
	liItem->addChild(li2);
	QTreeWidgetItem * li3 = new QTreeWidgetItem(QStringList() << QStringLiteral("网络"));
	liItem->addChild(li3);
	QTreeWidgetItem * li4 = new QTreeWidgetItem(QStringList() << QStringLiteral("集合"));
	liItem->addChild(li4);
	QTreeWidgetItem * li5 = new QTreeWidgetItem(QStringList() << QStringLiteral("材料"));
	liItem->addChild(li5);
	QTreeWidgetItem * li6 = new QTreeWidgetItem(QStringList() << QStringLiteral("属性"));
	liItem->addChild(li6);
	QTreeWidgetItem * li7 = new QTreeWidgetItem(QStringList() << QStringLiteral("载荷"));
	liItem->addChild(li7);

	li8 = new QTreeWidgetItem(QStringList() << QStringLiteral("约束"));
	liItem->addChild(li8);
	QTreeWidgetItem * li11 = new QTreeWidgetItem(QStringList() << QStringLiteral("小白"));
	li8->addChild(li11);

	QTreeWidgetItem * li9 = new QTreeWidgetItem(QStringList() << QStringLiteral("求解"));
	liItem->addChild(li9);
	QTreeWidgetItem * li10 = new QTreeWidgetItem(QStringList() << QStringLiteral("结果"));
	liItem->addChild(li10);
}

void Test_9::SlotCustomContextMenuRequested(const QPoint& pos)
{
	m_pact = new QAction(QStringLiteral("删除"), this);
	//QAction *pDelAction_1 = new QAction(QStringLiteral("重命名"), this);
	QMenu *popMenu = new QMenu(this);//定义右键弹出菜单
	popMenu->addAction(m_pact);//往菜单内添加QAction 
	// QAction *deleAction = cmenu->addAction("Delete");//另一种创建方式
	connect(m_pact, SIGNAL(triggered()), this, SLOT(DeleteItemFunction()));
	popMenu->exec(QCursor::pos());//弹出右键菜单,菜单位置为光标位置
}

void Test_9::DeleteItemFunction()
{
	QTreeWidgetItem * currentItem = ui.treeWidget->currentItem();//获取当前节点
	if (currentItem == NULL)
	{
		return;
	}
	else
		delete currentItem;
}

(2)Test_9.h完整内容如下:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_Test_9.h"

#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QMessageBox>
#include <QDebug>
#include <QStyleFactory>

#include<QAction.h>
#include<QMenu.h>

class Test_9 : public QMainWindow
{
	Q_OBJECT

public:
	Test_9(QWidget *parent = Q_NULLPTR);

private:
	Ui::Test_9Class ui;
	QTreeWidgetItem *li8;
	QAction *m_pact;

	private slots:
	void SlotCustomContextMenuRequested(const QPoint&);
	void DeleteItemFunction();
};

### 实现PyQt6 TreeWidget中的右键菜单 为了在PyQt6的`QTreeWidget`中实现右键点击弹出菜单的功能,可以遵循类似的逻辑来设置上下文菜单策略,并连接自定义槽函数处理菜单项的选择。下面展示具体的实现方式。 #### 设置上下文菜单政策并绑定信号到槽函数 首先,确保为树形组件开启定制化的上下文菜单选项,这允许通过鼠标右击触发特定行为: ```python self.treeWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) ``` 接着把`customContextMenuRequested`这个信号关联至负责显示菜单的方法上[^1]: ```python self.treeWidget.customContextMenuRequested.connect(self.show_context_menu) ``` 上述两行代码应当放置于初始化界面布局的部分内,比如窗口类构造器之中。 #### 构建与呈现菜单 当检测到用户请求打开上下文菜单时,则调用预设好的处理器方法创建实际可见的菜单对象及其条目;这里给出一个简单的例子用于清除除表头外的所有项目: ```python def show_context_menu(self, position): menu = QMenu() clear_action = QAction("Clear Items", self) clear_action.triggered.connect(lambda: self.clear_tree_items()) menu.addAction(clear_action) # 显示菜单前先移除已有动作以防重复添加 menu.exec_(self.treeWidget.viewport().mapToGlobal(position)) ``` 此部分实现了动态构建菜单以及响应用户的交互操作。每当用户在一个列表项上执行右键单击之后就会激活该过程[^3]。 #### 清理现有节点的操作 最后提供具体业务逻辑——即删除所有非根级别的元素(假设首行列作为不可见的父级容器),可以通过遍历整个模型结构完成这一任务: ```python def clear_tree_items(self): root = self.treeWidget.invisibleRootItem() # 获取隐藏的顶层项目 count = root.childCount() while count > 0: child_item = root.child(0) # 总是从第一个孩子开始取 root.removeChild(child_item) count -= 1 ``` 这段脚本会逐层迭代直至所有的子代都被释放掉为止,从而达到彻底清理的目的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值