首页 > 其他分享 >Qt天气预报系统鼠标拖动窗口

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

时间:2025-01-07 16:34:17浏览次数:3  
标签:窗口 Qt 拖动 void MainWindow event 鼠标

Qt天气预报系统

1、鼠标拖动窗口

1.1重写鼠标移动函数

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

在这里插入图片描述

1.2添加定义

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

在这里插入图片描述

1.3定义一个偏移值

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

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

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

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

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移动窗口

//鼠标移动
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - moffset);    //移动窗口
}
运行之后,窗口可以成功拖动,达到预期效果

2、.h文件和.cpp文件

2.1 .h文件

#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文件

#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、结论

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

正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助的话,可以点个

赞,谢谢大家!

愿大家多喜乐,长安宁!

鼠标拖动窗口完成!

标签:窗口,Qt,拖动,void,MainWindow,event,鼠标
From: https://blog.csdn.net/qq_62435866/article/details/144987134

相关文章

  • 在Lazarus下的Free Pascal编程教程——在应用程序中使用鼠标和键盘输入
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和“2.已经......
  • C++ Qt练习项目 QSpinBox和QDoubleSpinBos 未完待续
    个人学习笔记新建项目设计UI......
  • Qt 写无边框窗口时,遇到的问题与解决方法
    一、无边框窗口问题/需求汇总:1、窗口最大化时闪屏、卡顿问题。2、鼠标左键可移动窗口,但只在窗口上下左右30以内区域可移动,其它地方不可移动。3、双屏幕时,窗口最大、向下还原需要在当前屏幕显示,不回到主屏幕。4、窗口正常显示时在屏幕中间区域。5、窗口最大化显示......
  • Qt 状态机使用说明
    一、前言1、状态机,有限状态机,FiniteStateMachine,简写FSM。2、状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。3、简单说,状态机就是负责执行各种状态的切换。4、Qt状态机通过Qt......
  • Qt天气预报系统界面关闭
    Qt天气预报系统界面关闭1、点击右上角x退出1.1添加控件1.2修改控件名字1.3编程实现控件功能2、鼠标右键退出2.1重写鼠标点击事件2.2添加定义2.3添加一个菜单2.3.1创建一个菜单指针2.3.2创建一个菜单对象2.3.3显示菜单2.3.4定义一个菜单退出动作2.3.5在当前鼠标位置显示......
  • 无线鼠标新潮流:无线充电底座加持的未来趋势
    在当今这个科技飞速发展的时代,数码产品的迭代日新月异,无线鼠标作为电脑操作不可或缺的外设,也正悄然迈向一个全新的发展阶段——带有无线充电底座的无线鼠标将成为未来的主流趋势。从便捷性角度来看,传统无线鼠标往往依赖于干电池或内置可充电电池,使用干电池不仅成本较高,还需要频......
  • 使用canvas实现画布拖动
    在前端开发中,使用HTML5的<canvas>元素实现画布的拖动功能,通常涉及到监听鼠标事件(如mousedown、mousemove和mouseup)并相应地更新画布的状态。以下是一个简单的示例,展示了如何使用Canvas实现画布的拖动功能:HTML结构:<!DOCTYPEhtml><htmllang="en"><head><metacharset="......
  • 使用MingW-w64 编译 64bit Qt5
    现在Qt官方提供的mingw编译器的预编译版本都是32bit的,如果想使用64bit的话需要自己手动进行编译。自己编译的话只需要下载mingw-w64编译器和Qt的源码,之前在官方Wiki上看到还需要Perl,实际测试发现没有Perl也可以正常编译。mingw-w64直接去mingw-w64官网下载就可以了,选择MingW-W64......
  • 【静】1.修改fps microgame成为手机版(鼠标)
    1.fps鼠标锁死,先解决这个问题!2.vs中查找"mouse",一共有24处。看了看,有的涉及数值,但锁不住鼠标3.同上查找cursor,21处。Cursor.lockState(锁定在屏幕中央),Cursor.visible=false;(显示鼠标),不要想着一次性达到双端效果,现在就只做手机版。 4.粗略看,在结束游戏、退出游戏、唤醒......
  • 遗留了很久的功能终于搞定/QTreeWidget自定义节点/添加删除修改分组
    一、前言说明这个功能看起来简单,实际上也确实简单,以前没搞的时候还以为很难,难点就是如何存储这个任意层级的树状列表信息,近期大环境经济很差,刚好有空把这个功能搞定,其实二维表格的方式存储这种任意层级树结构就可以,就是子节点需要指定父节点,父节点为空表示顶层节点,最开始还考虑搞......