QT添加右键菜单(二):QWidget的右键菜单策略

前言:

上周刚刚发布了一篇博客,是关于使用QMenu类实现添加右键菜单,这才过了没多久,就在网上又发现了另一种添加右键菜单的方式,也就是本篇博客的要介绍的,使用QWidget的内部的右键菜单策略。两种方式实现起来都挺简单的,有兴趣的大佬也可以去下面的链接看看:QT添加右键菜单(一):使用QMenu进行实现。http://t.csdn.cn/0wzLe

1 .先看效果图

 效果很简单,就是在一个Widget中鼠标右键,弹出一个菜单栏,实现起来也很简单,但是和QMenu的使用方法还是不一样的,里面有些点还是需要记录一下的。

2.上代码、步骤以相关解释

1.新建项目的类必须继承子QWidget.

2.直接在该类的构造函数中加如如下代码

 //新建了5个Action
 QAction* m_ActionShow = new QAction(tr("Show pet"), this);
 QAction* m_ActionHide = new QAction(tr("Hide pet"), this);
 QAction* m_ActionModel = new QAction(tr("Model selecte"), this);
 QAction* m_ActionSetting = new QAction(tr("Setting widget"), this);
 QAction* m_ActionQuit = new QAction(tr("Exit"),this);
  
 //开始添加Action
 addAction(m_ActionShow);    
 addAction(m_ActionHide);
 addAction(m_ActionModel);
 addAction(m_ActionSetting);

 //创建并添加分割线
 QAction* separator = new QAction();
 separator->setSeparator(true);
 addAction(separator);

 addAction(m_ActionQuit);

 //设置右键菜单策略为上下文菜单
 setContextMenuPolicy(Qt::ActionsContextMenu);

总共代码就这些,实现的效果如本文开始的gif图一样,添加了5个菜单选项,其中还有一条分割线,需要注意的就2个点:

1.创建添加分割线,也是先 创建一个Action,然后把Action通过setSeparator(true);函数设置为分割线了。

2. 设置右键菜单策略为上下文菜单,直接调用setContextMenuPolicy(Qt::ActionsContextMenu);这个函数,将QWidgte的快捷菜单策略设置为右键菜单这种形式。

3.具体深入了解一下QWidget的上下文菜单策略

setContextMenuPolicy()该函数的参数是一个枚举,枚举值如下:

enum ContextMenuPolicy {
        NoContextMenu,
        DefaultContextMenu,
        ActionsContextMenu,
        CustomContextMenu,
        PreventContextMenu
    };

总共5个,每一个的作用都解释下:

1.Qt::NoContextMenu,本对象不显示右键菜单,由父对象决定,如果本例子中的参数设置为该值,那前面加的Action都没啥用!

2.Qt::DefaultContextMenu,默认的属性值,当前类的对象调用QWidget::contextMenuEvent()这个函数, 子类可以重写该事件处理函数,然后进行添加Action的操作。

3.Qt::ActionsContextMenu,将本QWidget的所有QAction作为右键显示的菜单,就是本例中使用到的。

4.Qt::CustomContextMenu,发送信号QWidget::customContextMenuRequested(), 此时可以写个槽函数,用connect将槽函数和这个信号连接起来,在槽函数里在做添加Action的操作。

5.Qt::PreventContextMenu,本对象不显示右键菜单,不过与Qt::NoContextMenu不同的是,它不在向上层传递右键菜单命令!

函数参数的含义和设置为该参数时,该如何使用,大致总结了一下,其他几个参数的具体使用可以亲自实践下。

4.总结

弹出一个右键菜单,使用QWidget的上下文菜单策略实现,和使用QMenu实现相比,代码量其实差不多,不过QMenu要重写鼠标按下事件并进行一个判断,多了一步。如果还有大佬知道其他方法实现,可以品论区一起交流学习下!

兄弟们,一起加油!一起变强!

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值