QT 让QLabel等组件支持右键菜单

前言

QT很多组件默认并没有鼠标点击事件,这里以QLabel标签为例,添加右键菜单。

在UI界面中拖入一个Label组件,如图:

添加一个类:labelMenu,可以直接写在主类文件中,但为了代码简洁一点,这里我创建了类文件:labelmenu.h、labelmenu.cpp

labelmenu.h文件完整内容如下:

#ifndef LABELMENU_H
#define LABELMENU_H

#include <QWidget>
#include <QDebug>
#include <QLabel>
#include <QMouseEvent>
#include <QAction>
#include <QMenu>

class labelMenu : public QLabel
{
    Q_OBJECT
public:
    labelMenu();

    explicit labelMenu(QWidget *parent = nullptr);

protected:
   //重写单击和双击事件
   virtual void mousePressEvent(QMouseEvent *event); //单击和右键事件
   virtual void mouseDoubleClickEvent(QMouseEvent *event); //双击事件

private:

signals:
    //自定义信号,在mousePressEvent事件发生时触发
    void clicked(); //单击信号
    void clicked_right(); //右键单击信号
    void doubleClicked();//双击信号

public slots:

};

#endif // LABELMENU_H

labelmenu.cpp文件完整内容:

#include "labelmenu.h"

//构造函数
labelMenu::labelMenu(QWidget *parent) :
    QLabel(parent)
{

}

//重写mousePressEvent单击事件
void labelMenu::mousePressEvent(QMouseEvent *event)
{
    switch (event->button()) {
    case Qt::LeftButton:
        emit clicked(); //发送左键单击信号
        break;

    case Qt::RightButton:
        emit clicked_right(); //发送右键单击信号
        break;
    }

    //将该事件传给父类处理
    QLabel::mousePressEvent(event);
}

//重写mouseDoubleClickEvent双击事件
void labelMenu::mouseDoubleClickEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        emit doubleClicked(); //发送左键双击信号
    }
    //将该事件传给父类处理
    QLabel::mouseDoubleClickEvent(event);
}

回到UI设计界面,提升label标签,如图:

 输入类名labelMenu后,点击添加:

 

添加后选中它,点击提升:

 提升完成后,在主类.h文件中添加(这里主类是Widget):

#include <labelmenu.h>

private:
    QMenu *menu = new QMenu(this); //创建菜单变量
    void initMenu(); //初始化右键菜单

private slots:
    void right_menu(); //弹出右键菜单
    void test(); //测试功能

如图:

widget.cpp文件中:

在构造函数中初始化右键菜单:initMenu();

如图:

初始化菜单initMenu()函数:

//初始化右键菜单
void Widget::initMenu(){
    /* 创建右键菜单 */
    QAction *test_menu = new QAction("测试 (&A)",this); //添加测试功能菜单,快捷键A

    /* 添加菜单项 */
    menu->addAction(test_menu);

    /* 连接槽函数 */
    connect(ui->label,SIGNAL(clicked_right()),this,SLOT(right_menu())); //连接label标签点击事件,此处不连接就不会弹出右键菜单
    connect(test_menu,SIGNAL(triggered()),this,SLOT(test())); //连接 测试 功能

}

弹出右键菜单right_menu()函数:

//弹出右键菜单
void Widget::right_menu(){
    //获取光标所在位置
    int x = cursor().pos().x();
    int y = cursor().pos().y();

    //获取菜单大小
    int w = menu->geometry().size().rwidth();
    int h = menu->geometry().size().rheight();

    //在光标位置弹出菜单
    menu->setGeometry(x,y,w,h);
    menu->show();
}

测试功能test()函数:

//测试功能
void Widget::test(){
    //这里写入功能实现代码
    qDebug()<<"测试功能";
}

搞定收工..

猜你喜欢

转载自blog.csdn.net/s806903/article/details/130007764
今日推荐