QT treewidget 右键菜单

VS2012+QT5.2 ,没有ui,纯代码实现右键

方法一:常规但略麻烦

 1、头文件slot中声明

QTreeWidget *tree; 

void showrightMenu(QPoint);//显示树目录右键菜单

 2、源文件中

tree = new QTreeWidget;
tree->setHeaderHidden(true);//隐藏树的标题栏
tree->setContextMenuPolicy(Qt::CustomContextMenu);//右键 不可少否则右键无反应

connect(tree,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showrightMenu(QPoint)));

并实现槽函数

void  classname::showrightMenu(QPoint point)
{
popMenu->clear();//清除原有菜单
popMenu->addAction(expandallAction);//如果放这是全局都有的右键
popMenu->addAction(foldedallAction);
//QTreeWidgetItem *item = tree->itemAt(point); //可得到右键条目
popMenu->exec(QCursor::pos());
}

 

其中expandallAction、foldedallAction及其方法的实现都是和菜单的一样如下:

声明:

QAction *expandallAction;
QAction *expandoneAction;

void expandalltreeItem();//右键展开所有树的条目
void foldedalltreeItem();//右键折叠所有树的条目

实现:

popMenu = new QMenu(this);
expandallAction = new QAction(QStringLiteral("展开全部"),this);
expandallAction->setStatusTip(QStringLiteral("展开全部"));
foldedallAction = new QAction(QStringLiteral("折叠全部"),this);
foldedallAction->setStatusTip(QStringLiteral("折叠全部"));

connect(expandallAction,SIGNAL(triggered()),this,SLOT(expandalltreeItem()));
connect(foldedallAction,SIGNAL(triggered()),this,SLOT(foldedalltreeItem()));

void classname::expandalltreeItem()
{
tree->expandAll();
}

void classname::foldedalltreeItem()
{
tree->collapseAll();
}

 方法二 简单有效

声明void contextMenuEvent ( QContextMenuEvent * event ); //右键坐标定位

实现:

void classname::contextMenuEvent(QContextMenuEvent * event )
{
popMenu->clear();//清除原有菜单
popMenu->addAction(expandallAction);//如果放这是全局都有的右键
popMenu->addAction(foldedallAction);
QPoint point = event->pos();//得到鼠标的位置全局坐标
QTreeWidgetItem *item = tree->itemAt(point);
popMenu->exec(QCursor::pos());//菜单出现的位置为当前鼠标的位置
event->accept();
}

其中expandallAction、foldedallAction及其方法的实现如上

 

区别:方法一的右键有效区为tree,也就是目录区,方法二右键的有效区为全部屏幕

转载于:https://www.cnblogs.com/etwd/p/4516472.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要设置 QTreeWidget 右键菜单的槽函数,可以按照以下步骤进行: 1. 创建一个右键菜单对象,可以使用 QMenu 类来实现,例如: ``` menu = QMenu(self) ``` 2. 向菜单中添加菜单项,可以使用 addAction() 方法来添加菜单项,例如: ``` delete_action = QAction("删除", self) menu.addAction(delete_action) ``` 3. 将菜单关联到 QTreeWidget 控件上,可以使用 setContextMenuPolicy() 方法来设置,例如: ``` tree_widget.setContextMenuPolicy(Qt.CustomContextMenu) ``` 4. 在 QTreeWidget 控件的 customContextMenuRequested 信号中处理右键菜单的显示和处理逻辑,例如: ``` @QtCore.pyqtSlot(QtCore.QPoint) def on_tree_widget_customContextMenuRequested(self, pos): global_pos = self.tree_widget.mapToGlobal(pos) item = self.tree_widget.itemAt(pos) if item is not None: menu = QMenu(self) delete_action = QAction("删除", self) menu.addAction(delete_action) action = menu.exec_(global_pos) if action == delete_action: self.tree_widget.takeTopLevelItem(self.tree_widget.indexOfTopLevelItem(item)) ``` 在这个例子中,我们将 QTreeWidget 控件的 customContextMenuRequested 信号与 on_tree_widget_customContextMenuRequested() 槽函数关联起来。在槽函数中,我们首先将鼠标坐标转换为全局坐标,然后获取当前选中的 QTreeWidgetItem 对象。如果选中了某个项,则创建一个右键菜单对象,添加一个删除菜单项,然后在当前鼠标位置显示菜单。当用户选择删除菜单项时,我们从 QTreeWidget 控件中删除当前项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值