qt右键弹出菜单的一些实现方法

在qt中,关于右键弹出菜单,有几种实现方法:

1-在窗口初始化时,修改指定控件的右键菜单策略,然后把右键点击信号和某个槽函数连接。

    //设置btnNew按钮的右键菜单策略
    ui->btnNew->setContextMenuPolicy(Qt::CustomContextMenu);
    //把btnNew按钮的右键点击信号和槽函数连接
    connect(ui->btnNew,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(on_btnNew_clicked()));

2-在窗口初始化时,给指定控件安装事件过滤器,然后重写窗口的eventFilter接口函数。

    //设置btnSave按钮的事件过滤器
    ui->btnSave->installEventFilter(this);
窗口头文件加入eventFilter接口函数的声明:
protected:
    bool eventFilter(QObject *watched, QEvent *event);

窗口实现文件eventFilter接口函数:

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    //检测btnSave按钮的右键菜单事件
    if (watched == ui->btnSave && event->type() == QEvent::ContextMenu)
    {
        QMenu * menu=new QMenu;
        QAction * saveaction=new QAction;
        saveaction->setText("保存按钮右键");
        menu->addAction(saveaction);
        menu->exec(QCursor::pos());
        return true;
    }
    //注意,最后要调用基类QObject的eventFilter接口,否则窗口无法响应
    return QObject::eventFilter(watched,event);
}

3-后面两种,跟上边一样,也是在窗口中重写派生保护函数contextMenuEvent和mousePressEvent。

窗口头文件加入这两个函数的声明:
protected:
    void contextMenuEvent(QContextMenuEvent *event);
    void mousePressEvent(QMouseEvent *event);

窗口实现文件:


//重写窗口contextMenuEvent函数实现label右键菜单
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    //把鼠标位置转化成相对于label的位置
    QPoint i = ui->labelSnapshot->mapFromGlobal(event->globalPos());
    //获取label的尺寸
    QRect rect(QPoint(0,0),ui->labelSnapshot->size());
    //然后判断鼠标位置是否在label内.
    if (rect.contains(i))
    {
        QMenu * menu=new QMenu;
        QAction * saveaction=new QAction;
        saveaction->setText("label另存");
        connect(saveaction,SIGNAL(triggered(bool)),this,SLOT(on_btnSave_clicked()));
        menu->addAction(saveaction);
        menu->exec(event->globalPos());
    }
}

//重写窗口mousePressEvent函数实现text右键菜单
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons()==Qt::RightButton)
    {
        //把鼠标位置转化成相对于text的位置
        QPoint i = ui->textEdit->mapFromGlobal(event->globalPos());
        //获取text的尺寸
        QRect rect(QPoint(0,0),ui->textEdit->size());
        //然后判断鼠标位置是否在text内.
        if (rect.contains(i))
        {
            QMenu * menu=new QMenu;
            QAction * saveaction=new QAction;
            saveaction->setText("text另存");
            connect(saveaction,SIGNAL(triggered(bool)),this,SLOT(on_btnSave_clicked()));
            menu->addAction(saveaction);
            menu->exec(event->globalPos());
        }
    }
}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值