Qt实现鼠标右键弹出弹窗退出

Qt鼠标右键弹出弹窗退出

1、鼠标右键实现

1.1 重写鼠标点击事件

cpp 复制代码
protected:
    void mousePressEvent(QMouseEvent *event) override;          //重写鼠标点击事件

1.2 添加头文件

1.3 添加定义

cpp 复制代码
//鼠标点击事件
void wearherMainInterface::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton)
    {
        
    }
}

2、添加菜单

2.1添加菜单头文件

2.2创建菜单对象

cpp 复制代码
QMenu *quitMenu;            //创建退出菜单指针
cpp 复制代码
quitMenu = new QMenu(this);     //创建菜单对象

2.3 显示菜单

cpp 复制代码
//鼠标点击事件
void wearherMainInterface::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton)
    {
        quitMenu->exec();           //显示菜单
    }
}

3、添加动作

3.1添加动作资源文件

|----------|
| 先去网站下载图标 |

图标网站链接

|------|
| 下载图标 |

|------------------|
| 下载的图标剪切到你的资源文件夹下 |

|--------------------------|
| 添加现有文件,没有资源文件要自己新建一个资源文件 |


3.2 添加头文件

3.3 创建退出动作对象

cpp 复制代码
QAction *quitAction = new QAction(QIcon(":/widdgetMainInterface/exit.png"),"退出",this);

3.4菜单添加动作对象

cpp 复制代码
quitMenu->addAction(quitAction);             //菜单添加动作对象

4、在当前鼠标位置显示菜单

4.1当前鼠标位置显示菜单

cpp 复制代码
//鼠标点击事件
void wearherMainInterface::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton)
    {
        quitMenu->exec(QCursor::pos());           //当前鼠标位置显示菜单
    }
}

5、新增菜单被触发后槽函数,并连接信号与槽

cpp 复制代码
//连接菜单被触发的信号与槽
connect(quitMenu,&QMenu::triggered,this,&wearherMainInterface::quitMenuTriggered);  

6、实现槽函数

6.1 添加弹窗头文件

6.2 添加弹窗资源文件

|---------|
| 跟上面步骤一样 |

6.3槽函数实现

cpp 复制代码
//菜单被触发后槽函数
void wearherMainInterface::quitMenuTriggered()
{
    QMessageBox quitMes;                        //创建退出弹窗对象
    quitMes.setWindowTitle("关闭界面");          //弹窗标题
    quitMes.setWindowIcon(QIcon(":/widdgetMainInterface/exit.png"));        //设置窗口图标
    quitMes.setIcon(QMessageBox::Warning);      //弹窗图片
    quitMes.setText("是否关闭弹窗");              //弹窗文本
    
    quitMes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);      //设置Ok和Cancle两个按钮
    quitMes.setButtonText(QMessageBox::Ok, "确认");           //Ok改为确认
    quitMes.setButtonText(QMessageBox::Cancel,"取消");        //Cancle改为取消
    
    int result = quitMes.exec();       //显示信息框等待用户交互
    //如果用户选择了Ok
    if(result == QMessageBox::Ok)
    {
        this->close();          //关闭界面
    }
    else    //用户取消什么都不做
    {
        
    }  
}

7、.h文件和.cpp文件

7.1 .h文件

cpp 复制代码
#ifndef WEARHERMAININTERFACE_H
#define WEARHERMAININTERFACE_H

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

namespace Ui {
class wearherMainInterface;
}

class wearherMainInterface : public QWidget
{
    Q_OBJECT

public:
    explicit wearherMainInterface(QWidget *parent = nullptr);
    ~wearherMainInterface();

protected:
    void mousePressEvent(QMouseEvent *event) override;          //重写鼠标点击事件


private slots:
    void on_quitPushButton_clicked();               //退出按钮
    void quitMenuTriggered();                       //菜单被触发后处理槽函数

private:
    Ui::wearherMainInterface *ui;

    QMenu *quitMenu;            //创建退出菜单指针

};

#endif // WEARHERMAININTERFACE_H

7.2 .cpp文件

cpp 复制代码
#include "wearhermaininterface.h"
#include "ui_wearhermaininterface.h"


wearherMainInterface::wearherMainInterface(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::wearherMainInterface)
{
    ui->setupUi(this);

    quitMenu = new QMenu(this);     //创建菜单对象
    QAction *quitAction = new QAction(QIcon(":/widdgetMainInterface/exit.png"),"退出",this);
    quitMenu->addAction(quitAction);             //菜单添加动作对象

    //连接菜单被触发的信号与槽
    connect(quitMenu,&QMenu::triggered,this,&wearherMainInterface::quitMenuTriggered);


}

wearherMainInterface::~wearherMainInterface()
{
    delete ui;
}

//鼠标点击事件
void wearherMainInterface::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton)
    {
        quitMenu->exec(QCursor::pos());           //当前鼠标位置显示菜单
    }
}

//退出按钮
void wearherMainInterface::on_quitPushButton_clicked()
{
    QMessageBox quitMes;                        //创建退出弹窗对象
    quitMes.setWindowTitle("关闭界面");          //弹窗标题
    quitMes.setWindowIcon(QIcon(":/widdgetMainInterface/MesPanda.png"));        //设置窗口图标
    quitMes.setIcon(QMessageBox::Warning);      //弹窗图片
    quitMes.setText("是否关闭弹窗");              //弹窗文本

    quitMes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);      //设置Ok和Cancle两个按钮
    quitMes.setButtonText(QMessageBox::Ok, "确认");           //Ok改为确认
    quitMes.setButtonText(QMessageBox::Cancel,"取消");        //Cancle改为取消

    int result = quitMes.exec();       //显示信息框等待用户交互
    //如果用户选择了Ok
    if(result == QMessageBox::Ok)
    {
        this->close();          //关闭主界面
    }
    else    //用户取消什么都不做
    {

    }
}

//菜单被触发后槽函数
void wearherMainInterface::quitMenuTriggered()
{
    QMessageBox quitMes;                        //创建退出弹窗对象
    quitMes.setWindowTitle("关闭界面");          //弹窗标题
    quitMes.setWindowIcon(QIcon(":/widdgetMainInterface/MesPanda.png"));        //设置窗口图标
    quitMes.setIcon(QMessageBox::Warning);      //弹窗图片
    quitMes.setText("是否关闭弹窗");              //弹窗文本

    quitMes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);      //设置Ok和Cancle两个按钮
    quitMes.setButtonText(QMessageBox::Ok, "确认");           //Ok改为确认
    quitMes.setButtonText(QMessageBox::Cancel,"取消");        //Cancle改为取消

    int result = quitMes.exec();       //显示信息框等待用户交互
    //如果用户选择了Ok
    if(result == QMessageBox::Ok)
    {
        this->close();          //关闭界面
    }
    else    //用户取消什么都不做
    {

    }
}

8、总结

|---------------------------------------------------------------------------------------------------------------|
| 以上就是Qt实现鼠标右键弹出弹窗退出的整个过程了,浏览过程中,如若发现错误,欢 迎大家指正,有问题的可以评论区留言或者私信。 最后,如果大家觉得有所帮助的话, 可以点个赞,谢谢大家!梦虽遥,追则能达;愿虽艰,持则可圆! |

Qt实现鼠标右键弹出弹窗退出完成!

相关推荐
科技每日热闻15 分钟前
影刃出鞘,酣战全场!EVNIA弈威双核电竞显示器27M2N6500L震撼登场!
科技·计算机外设
JIngJaneIL1 小时前
远程在线诊疗|在线诊疗|基于java和小程序的在线诊疗系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·在线诊疗小程序
川石课堂软件测试1 小时前
自动化过程中验证码的解决思路
数据库·python·功能测试·测试工具·单元测试·tomcat·自动化
IT利刃出鞘2 小时前
WordPress插件--Redis Object Cache对象缓存插件的用法
数据库·redis·缓存
面向星辰2 小时前
sql通配符(大量查找搜索索引)
数据库·sql
斐硕人2 小时前
SQL滚动求和
数据库·sql·mysql·maxcompute
爬山算法2 小时前
Redis(135)Redis的网络模型是什么?
网络·数据库·redis
L.EscaRC2 小时前
Redis大Key与内存不足问题深度解析与应对策略
数据库·redis·缓存
雲烟3 小时前
Qt SQLite在I.mx8上使用问题
数据库·qt·i.mx8
TDengine (老段)3 小时前
TDengine 转换函数 CAST 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据