首页 > 其他分享 >QTreeWidget 添加右键菜单

QTreeWidget 添加右键菜单

时间:2023-10-30 15:35:08浏览次数:34  
标签:菜单 menu tree 右键 QTreeWidget QAction

有时需要为 QTreeWidget 的子条目添加右键菜单功能,主要有两种方案来实现:

方案一

该方案比较通用,通过为 QTreeWidget 建立信号槽,在接受 itemPressed 的信号时会被触发,然后判断当前是否为鼠标右键,
若为鼠标右键则创建添加对应的菜单栏,并提供相应的功能。

// 1. QTreeWidget* tree 为树 tree 创建信号槽,鼠标press时会触发对应的信号。
connect(tree, &QTreeWidget::itemPressed, this, &Demo01_GUI::OnRightButtonClicked);

// 2. 槽函数来创建右键菜单,并处理对应的事件功能。
void Demo01_GUI::OnRightButtonClicked(QTreeWidgetItem* item, int column)
{
    if(qApp->mouseButtons() == Qt::RightButton) // 只针对鼠标右键
    {
        QTreeWidget* tree = item->treeWidget(); // 获取当前item所在的QTreeWidget

        // [option] 此处可以添加条件来只针对指定的QTreeWidgetItem来添加右键菜单功能。

        QMenu* menu = new QMenu(tree);
        QAction* action1 = new QAction("open folder");
        QAction* action2 = new QAction("edit file");
        menu->addAction(action1);
        menu->addAction(action2);

        // 为右键菜单上的QAction创建信号槽,添加对应的功能
        connect(action1, &QAction::triggered, this, [ = ]
        {
            QMessageBox::warning(this, "Action", "Open folder");
        });

        connect(action2, &QAction::triggered, this, [ = ]
        {
            QMessageBox::warning(this, "Action", "edit file");
        });

        // 右键菜单在鼠标点击的位置显示
        menu->exec(QCursor::pos());
    }

}

其右键菜单效果如下图所示:


方案二

该方案通过 QTreeWidget::customContextMenuRequested 信号来触发并显示对应的菜单栏功能,使用该信号之前需要先调用 setContextMenuPolicy(Qt::CustomContextMenu) 来设置 ContextMenuPolicy 为自定义菜单栏 Qt::CustomContextMenu,然后才可以在右键时直接触发对应的事件。

// 1. 设置菜单文本的策略为自定义
tree->setContextMenuPolicy(Qt::CustomContextMenu);

// 2. 为QTreeWidget的对象指针 tree 创建信号槽,来接受处理右键事件。
connect(tree, &QTreeWidget::customContextMenuRequested, this, &Demo01_GUI::OnRightClicked);

/// <summary>
/// 该槽函数的参数为鼠标右键时的坐标点
/// </summary>
/// <param name="point"></param>
void Demo01_GUI::OnRightClicked(const QPoint& point)
{
    QTreeWidget* curTree = qobject_cast<QTreeWidget*>(sender());
    QTreeWidgetItem* item = curTree->itemAt(point);

    QMenu* menu = new QMenu(curTree);
    menu->addAction(new QAction("MyAction0001"));
    menu->addAction(new QAction("MyAction0004"));
    menu->addAction(new QAction("MyAction0006"));
    menu->exec(QCursor::pos());
}


以上两种方案都可以实现右键菜单功能,一般方案一更具有通用性,其实现逻辑也更容易理解。

标签:菜单,menu,tree,右键,QTreeWidget,QAction
From: https://www.cnblogs.com/Jeffxu/p/17797975.html

相关文章

  • PDMS & AM 侧边栏菜单 C# WPF技术
    项目的完整下载地址https://files.cnblogs.com/files/NanShengBlogs/AMCSTest.zip?t=1698491030&download=true先看效果 下面先看实现的几个函数1#创建wpf的用户控件,无选项的参考此链接修改csproject文件类库项目添加wpf方法写入下列代码<UserControlx:Class="AMCSTe......
  • winforms的datagridview内设置右键菜单,并删除指定一行,之后序列号改变
    一、编辑右键菜单  1、在工具箱中拖入一个contextMenuStrip控件;  2、编辑contextMenuStrip控件,在控件内添加想要的选项,在此添加“删除”选项;  3、(可选项)绑定DataGridView和新增的contextMenuStrip1,选中DataGridView,属性,contextMenuStrip中选择下拉:contextMenuStrip1......
  • c# winfom从0学习开发开发OA、BPM工作流程与自定义表单系统(三)设计程序导航菜单
         程序的导航菜单是开发者前提定义好的功能,所以不涉及自主添加删除,只需要后期针对用户对应的角色进行权限控制即可,所以设计为属性结构显示导航菜单预览的一个功能。......
  • 麒麟KYLINOS上使用开始菜单图标开启或关闭vnc
    往期文章:麒麟KYLINOS桌面操作系统2303上安装tigervnchello,大家好啊,今天给大家带来第二篇在麒麟KYLINOS上安装部署vnc的文章,本篇文章讲述了如何将vnc的开启及关闭做成图标展示在开始菜单,并且设置当第一次启动vnc的时候设置默认的vnc密码,可以通过点击图标开启vnc及关闭vnc。1、编辑st......
  • vue el-select 下拉菜单 数据回显不在清除数据可编辑状态
    思路:当点击options的时候,让select失去焦点(跳到其他的地方),添加el-input就是为了把光标跳转到其上面,然后将其隐藏掉,则为看不到光标点,但是在点击第一次之后获取焦点focus之后,隐藏掉下拉菜单的时候@blur是无效的,此时只能通过监听下拉框是否是隐藏和显示状态来让其失去焦点事件,所以......
  • vscode右键没有open with live server
    写原生界面时右击html查看效果看结果没有liveserver如:安装插件"liveserver"......
  • vue-element-admin 项目中,获取当前左侧菜单栏的Id
      找到 store/modules/permission.js(需要后端在返回的菜单中,添加Id):constpermission={state:{routes:[],addRoutes:[]},mutations:{SET_ROUTES:(state,routes)=>{state.addRoutes=routes......
  • 使用axum构建博客系统 - 后台管理菜单及首页模板
    目前,后台管理功能基本完成,但还有两个工作没做:清理后台管理的导航菜单以及后台管理首页的模板。后台管理菜单<!--templates/backend/base.html--><!--...--><divclass="container-fluid"><divclass="row"><navid="sidebarMenu"c......
  • QT 菜单中添加Qcheckbox复选框
    //回放autowidget=newQWidget;{autocheckbox=newQCheckBox("回放");autolayout=newQHBoxLayout;layout->addWidget(checkbox);layout->setContentsMargins(5,1,5,1);widget->setLayout(l......
  • 使用hbuilder实现左右菜单联动功能
    <template><viewclass="cbcd"><scroll-viewscroll-yscroll-with-animationclass="u-tab-viewmenu-scroll-view":scroll-top="scrollTop"><viewv-for="(item,index)intabbar&qu......