当前位置: 首页 > news >正文

Qt实现鼠标拖动窗口

Qt实现鼠标拖动窗口

  • 1、设置窗口无边框
  • 2、重写鼠标点击,移动函数
    • 2.1添加头文件
    • 2.2 重写函数
    • 2.3 添加定义
  • 3、定义一个偏移值
  • 4、判断鼠标左键是否按下并计算偏移值
  • 5、移动窗口
  • 6、.h文件和.cpp文件
    • 6.1 .h文件
    • 6.2 .cpp文件
  • 7、总结

1、设置窗口无边框

this->setWindowFlag(Qt::FramelessWindowHint);        //设置窗口无边框

2、重写鼠标点击,移动函数

2.1添加头文件

在这里插入图片描述

2.2 重写函数

在这里插入图片描述

2.3 添加定义

//鼠标移动事件
void wearherMainInterface::mouseMoveEvent(QMouseEvent *event)
{
    
}

3、定义一个偏移值

在这里插入图片描述

4、判断鼠标左键是否按下并计算偏移值

//鼠标点击事件
void wearherMainInterface::mousePressEvent(QMouseEvent *event)
{
    //判断右键是否按下
    if(event->button() == Qt::RightButton)
    {
        quitMenu->exec(QCursor::pos());           //当前鼠标位置显示菜单
    }
    
    //判断左键是否按下
    if(event->button() == Qt::LeftButton)
    {
        
    }
}

5、移动窗口

//鼠标移动事件
void wearherMainInterface::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - moffset);       //移动窗口
}

6、.h文件和.cpp文件

6.1 .h文件

#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;          //重写鼠标点击事件
    void mouseMoveEvent(QMouseEvent *event) override;           //重写鼠标移动事件


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

private:
    Ui::wearherMainInterface *ui;

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

    QPoint moffset;             //鼠标与窗口左上角的偏移值

};

#endif // WEARHERMAININTERFACE_H

6.2 .cpp文件

#include "wearhermaininterface.h"
#include "ui_wearhermaininterface.h"


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

    this->setWindowFlag(Qt::FramelessWindowHint);           //去边框
//    this->setAttribute(Qt::WA_TranslucentBackground);       //半透明背景
    
    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());           //当前鼠标位置显示菜单
    }

    //判断左键是否按下
    //当前鼠标位置        event->globalPos()
    //当前窗口位置        this->pos()
    if(event->button() == Qt::LeftButton)
    {
        moffset = event->globalPos() - this->pos();  //当前鼠标位置减去当前窗口位置得到偏移值
    }
}

//鼠标移动事件
void wearherMainInterface::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - moffset);       //移动窗口
}

//退出按钮
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    //用户取消什么都不做
    {

    }
}

7、总结

以上就是Qt实现鼠标拖动窗口的整个过程了,浏览过程中,如若发现错误,欢迎大家指

正,有问题的可以评论区留言或者私信。.h文件和.cpp文件中还有一些别的功能,大家

可以选择性参考 最后,如果大家觉得有所帮助的话,可以点个赞,谢谢大家!梦虽遥,

追则能达;愿虽艰,持则可圆!

相关文章:

  • Java 基础-32-枚举-枚举的应用场景
  • Flink介绍——实时计算核心论文之Storm论文详解
  • 以太网安全
  • 达芬奇20正式版 Davinci Resolve Studio 20 支持WIN
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(十一)
  • Systemd构建容器化微服务集群管理系统
  • Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)
  • C++之红黑树
  • JAVA EE_多线程-初阶(二)
  • 车载诊断架构 --- 整车重启先后顺序带来的思考
  • 深入理解C++中的itoa()函数 --任意进制之间转换函数
  • 【并发编程 | 第七篇】深入学习线程池(一)
  • 程序化广告行业(64/89):AdX/SSP系统广告位设置全解析
  • C++ 并发性能优化实战:提升多线程应用的效率与稳定性
  • 单调栈学习C++
  • 【备赛】使用ADC测量电压、占空比
  • 关联容器-模板类pair数对
  • [oeasy]082_list_列表类_空列表
  • 【大模型】DeepSeek + 蓝耕MaaS平台 + 海螺AI生成高质量视频操作详解
  • 算法竞赛备赛——【图论】链式前向星
  • 网站描述应该怎么写/职业技术培训机构
  • bitcoind 做交易网站/武汉 网络 推广
  • 睢阳区网/关键词在线优化
  • 哪些人做数据监测网站/链友咨询
  • 免费手机网站空间/最新网络营销方式有哪些
  • 网站建设销售培训语/站长号