右键菜单事件

下面这个例子就是重写了右键菜单事件,鼠标在里面右键时,在右键位置处产生了一个菜单

右键菜单事件

在窗口/控件上面点击鼠标右键时,就会触发该事件,

对应的子类是:

QContextMenuEvent

对应的事件类型是:

QEvent::ContextMenu

需要重写的函数是:

void contextMenuEvent(QContextMenuEvent* ev) override

作用:

通常用来快速实现鼠标右击时产生一个菜单

常用方法:

QContextMenuEvent::globalPos()//获取鼠标点击时所在的全屏位置,然后把菜单显示在这个点这里

举例:

见代码

#ifndef RIGHTBUTTONEVENT_H
#define RIGHTBUTTONEVENT_H

#include <QWidget>
#include<QMenu>
#include<QAction>
#include<QContextMenuEvent>
#include<QMessageBox>

class RightButtonEvent : public QWidget
{
    Q_OBJECT
private:
    QAction* cut;
    QAction* copy;
    QAction* paste;
    QAction* to_upper;
    QAction* to_lower;
    QAction* hide_line;

public:
    explicit RightButtonEvent(QWidget *parent = nullptr): QWidget{parent}
    {
        cut=new QAction("剪切(T)",this);
        copy=new QAction("复制(C)",this);
        paste=new QAction("粘贴(P)",this);
        to_upper=new QAction("转成大写(U)",this);
        to_lower=new QAction("转成小写(L)",this);
        hide_line=new QAction("隐藏行",this);

        //每个菜单项都绑定到同一个槽函数
        connect(cut,&QAction::triggered,this,&RightButtonEvent::doSomthing);
        connect(copy,&QAction::triggered,this,&RightButtonEvent::doSomthing);
        connect(paste,&QAction::triggered,this,&RightButtonEvent::doSomthing);
        connect(to_upper,&QAction::triggered,this,&RightButtonEvent::doSomthing);
        connect(to_lower,&QAction::triggered,this,&RightButtonEvent::doSomthing);
        connect(hide_line,&QAction::triggered,this,&RightButtonEvent::doSomthing);

    }
public slots:
    void doSomthing()
    {
        //槽函数中可以调用祖宗类QObject类的sender()方法,来获取触发槽函数的信号的发送者
        //因此每个菜单项绑定同一个槽函数就可以了,在这个槽函数中用这个方法来区分不同的菜单项
        //从而对应的不同处理
        QAction* act=static_cast<QAction*>(sender());

        //根据菜单项的不同来处理不同的逻辑,
        if(act==cut)
        {
            QMessageBox::information(this,"",act->text());
        }
        else if(act==copy)
        {
            QMessageBox::warning(this,"",act->text());
        }

    }

protected:
    //重写该函数,鼠标右键这个控件时就会弹出想要的菜单
    void contextMenuEvent(QContextMenuEvent* ev) override
    {
        //显示菜单
        QMenu* menu=new QMenu(this);
        menu->setFixedWidth(160);
        menu->addAction(cut);
        menu->addAction(copy);
        menu->addAction(paste);
        menu->addSeparator();
        menu->addAction(to_upper);
        menu->addAction(to_lower);
        menu->addSeparator();
        menu->addAction(hide_line);

        //调用exec()方法将菜单显示在对应的位置
        //注意要用globalPos()方法获取到的位置
        menu->exec(ev->globalPos());


        //每一次右键点击都会触发一次菜单事件,不释放会内存泄漏,当然可以不用new,直接定义在栈上
        delete menu;//记得释放内存
    }

signals:
};

#endif // RIGHTBUTTONEVENT_H

小的知识点:

显示的菜单的位置要使用QContextMenuEvent::globalPos()获取到的位置,才能把菜单显示到鼠标右击时的那个点处

每个菜单项可以绑定同一个槽函数,不用每一个菜单项绑定一个不同的槽函数,可以在同一个槽函数中通过调用祖宗类QObject类的sender()方法,来区分触发槽函数的信号发送者是哪一个菜单项,然后做不同的处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值