前言
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()<<"测试功能";
}
搞定收工..