Qt天气预报系统鼠标拖动窗口

Qt天气预报系统

1、鼠标拖动窗口

1.1重写鼠标移动函数

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

1.2添加定义

|---------------------------------------|
| 把鼠标移动到mouseMoveEvent上,ALT+Enter选择添加定义 |

1.3定义一个偏移值

cpp 复制代码
private:
    Ui::MainWindow *ui;
    QMenu *quitMenu;                            //创建一个菜单指针
    QAction *quitAct;                           //定义一个动作
    QPoint moffset;                             //窗口移动时,鼠标与窗口左上角的偏移值

1.4判断鼠标左键是否被按下

cpp 复制代码
void MainWindow::mousePressEvent(QMouseEvent *event)
{
  //如果右键被按下
  if(event->button() == Qt::RightButton)
  {
      quitMenu->exec(QCursor::pos());       //在当前鼠标位置显示菜单
  }
  
  if(event->button() == Qt::LeftButton)
  {
      
  }
}

1.5计算当前鼠标位置与窗口左上角位置的偏移值

cpp 复制代码
void MainWindow::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();
  }
}

1.6移动窗口

cpp 复制代码
//鼠标移动
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - moffset);    //移动窗口
}

|----------------------|
| 运行之后,窗口可以成功拖动,达到预期效果 |

2、.h文件和.cpp文件

2.1 .h文件

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenu>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

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

private slots:
    void on_pushButton_quit_clicked();          //关闭UI界面
    void onQuitActTriggered();                  //菜单被点击后的处理

private:
    Ui::MainWindow *ui;
    QMenu *quitMenu;                            //创建一个菜单指针
    QAction *quitAct;                           //定义一个动作
    QPoint moffset;                             //窗口移动时,鼠标与窗口左上角的偏移值

    bool closePOPWindow();                      //关闭窗口的弹窗
};
#endif // MAINWINDOW_H

2.2 .cpp文件

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMouseEvent>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowFlag(Qt::FramelessWindowHint);
//    this->setLayout(ui->gridLayoutGlobal);      //让界面随着窗口变幻大小

    quitMenu = new QMenu(this);         //创建一个QMenu对象
    quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this);     //定义一个退出动作
    quitMenu->addAction(quitAct);       //添加动作

//    connect(quitMenu,&QMenu::triggered,this,[=]{
//        this->close();
//    });         //连接信号与槽

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

}

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

//鼠标点击
void MainWindow::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 MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - moffset);    //移动窗口
}

//弹窗
bool MainWindow::closePOPWindow()
{
    // 创建一个消息框询问用户是否真的要退出
    QMessageBox mes;
    mes.setWindowTitle("关闭窗口");
    //  mes.setWindowFlags(Qt::Drawer);       //把标题栏去掉
    mes.setIcon(QMessageBox::Warning);    //设置一个警告图片
    mes.setText("是否关闭窗口?");          //弹窗文本

    mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);     //设置两个按钮
    mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标
    mes.setButtonText(QMessageBox::Ok, tr("确定"));               //ok改为确认
    mes.setButtonText(QMessageBox::Cancel, tr("取消"));           //Cancel改为取消

    // 显示消息框并等待用户交互
    int result = mes.exec();

    // 根据用户的选择执行相应的操作
    if (result == QMessageBox::Ok) {
        // 用户选择了确定,关闭主窗口
        this->close();
        return true;
    }
    // 用户选择了取消,不关闭主窗口
    else
    {
        return false;     // 窗口关闭操作失败
    }
}

//右上角退出
void MainWindow::on_pushButton_quit_clicked()
{
    closePOPWindow();
}

//鼠标右键退出
void MainWindow::onQuitActTriggered()
{
    closePOPWindow();
}

3、结论

|--------------------------------------------------------------------------------------------------|
| 以上就是实现鼠标拖动窗口的整个过程了,浏览过程中,如若发现错误,欢迎大家指 正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助的话,可以点个 赞,谢谢大家! 愿大家多喜乐,长安宁! |

鼠标拖动窗口完成!

相关推荐
霜雪殇璃1 分钟前
(定时器,绘制事件,qt简单服务器的搭建)2025.2.11
运维·服务器·qt·学习
nqqcat~12 分钟前
集合7天学java—day2
java·开发语言
if就13 分钟前
Java_多线程
android·java·开发语言
后端小肥肠16 分钟前
FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案
java·开发语言·spring boot·后端·excel
KK虫17 分钟前
【C++八股】struct和Class的区别
开发语言·c++
瑶光守护者18 分钟前
【DeepSeek】Deepseek辅组编程-通过卫星轨道计算终端距离、相对速度和多普勒频移
开发语言·matlab·卫星通信·deepseek
Unity官方开发者社区1 小时前
团结引擎高性能ECS架构(上)
java·开发语言·架构
DXX——2 小时前
嵌入式基础学习|C语言篇——结构体(含进阶)二
c语言·开发语言·学习
兀行者(做个有情怀的java程序员)2 小时前
什么是Java虚拟机(JVM)?它的作用是什么?
java·开发语言·jvm
liberty0307062 小时前
40环状DNA序列的最小表示法Java版-青训营刷题
java·开发语言