Qt桌面应用开发 第九天(综合项目一 飞翔的鸟)

目录

1.鸟类创建

2.鸟动画实现

3.鼠标拖拽

4.自动移动

5.右键菜单

6.窗口透明化


项目需求:

实现思路:

  1. 创建项目
  2. 导入资源
  3. 鸟类创建
  4. 鸟动画实现
  5. 鼠标拖拽实现
  6. 自动移动
  7. 右键菜单
  8. 窗口透明化

1.鸟类创建

①鸟类中包含鸟图片、鸟图片的最小值下标和最大值下标

class Bird : public QWidget
{Q_OBJECT
public:explicit Bird(QWidget *parent = nullptr);QPixmap m_Bird_Pix;//鸟显示的图片int min=1;//最小值图片下标int max=2;//最大值图片下标signals:public slots:
};

②将鸟的图片资源加载到对应项目下的文件中

Bird::Bird(QWidget *parent): QWidget{parent}
{for(int i=0;i<this->max;i++){QString path=QString(":/Image/%1.png").arg(i);this->m_Bird_Pix.load(path);}//设置鸟的尺寸this->setFixedSize(this->m_Bird_Pix.width(),this->m_Bird_Pix.height());
}

③将鸟类对象添加到主窗口中

MainScene::MainScene(QWidget *parent): QWidget(parent), ui(new Ui::MainScene)
{ui->setupUi(this);this->m_Bird=new Bird;//将鸟对象设置到窗口中this->m_Bird->setParent(this);//设置窗口尺寸this->setFixedSize(this->m_Bird->width(),this->m_Bird->height());
}MainScene::~MainScene()
{delete ui;
}void MainScene::paintEvent(QPaintEvent *)
{QPainter painter(this);//绘制鸟的图像painter.drawPixmap(0,0,this->m_Bird->m_Bird_Pix);
}

2.鸟动画实现

鸟类中:设置一个定时器,每0.7秒超时一次,超时后加载小鸟图片,并发出切图信号

class Bird : public QWidget
{Q_OBJECT
public:explicit Bird(QWidget *parent = nullptr);QPixmap m_Bird_Pix;//鸟显示的图片int min=1;//最小值图片下标int max=2;//最大值图片下标QTimer* timer;//执行动画函数void running();
signals://代表正在做动画切图void changePix();public slots:
};
Bird::Bird(QWidget *parent): QWidget{parent}
{for(int i=0;i<this->max;i++){QString path=QString(":/Image/%1.png").arg(i);this->m_Bird_Pix.load(path);}//设置鸟的尺寸this->setFixedSize(this->m_Bird_Pix.width(),this->m_Bird_Pix.height());this->timer=new QTimer(this);connect(this->timer,&QTimer::timeout,[=]{QString path=QString(":/Image/%1.png").arg(this->min++);//超时之后,加载图片this->m_Bird_Pix.load(path);if(this->min>this->max){this->min=1;}//切图emit changePix();})
}void Bird::running()
{//0.7秒切一次动画this->timer->start(70);
}

主程序中:只要小鸟对象发出切图信号,就刷新一次

MainScene::MainScene(QWidget *parent): QWidget(parent), ui(new Ui::MainScene)
{ui->setupUi(this);this->m_Bird=new Bird;//将鸟对象设置到窗口中this->m_Bird->setParent(this);//设置窗口尺寸this->setFixedSize(this->m_Bird->width(),this->m_Bird->height());//启动计时器,开始动画this->m_Bird->running();//监听鸟在切图的信号connect(this->m_Bird,&Bird::changePix,[=]{update();})
}

3.鼠标拖拽

1.获取鼠标(QMouseEvent)点击的位置相对于全局窗口的坐标(globalPos())

2.获取鸟类窗口的左上角定点位置

3.计算鼠标点击位置到鸟类窗口左上角的相对分量,这一分量是绝对的

void Bird::mousePressEvent(QMouseEvent *e)
{this->m_Pox=e->globalPos()-((QWidget*)this->parent())->frameGeometry().topLeft();
}

4.当鼠标拖拽到另一点时,鼠标点击位置可以获取到,相对分量也知道,鸟类窗口的位置即【鼠标点击位置-相对分量】

5.完成鼠标拖拽后,将鸟类窗口位置作为参数,发送窗口移动的信号

void Bird::mouseMoveEvent(QMouseEvent *e)
{emit this->moving(e->globalPos()-this->m_Pox);
}

6.主窗口,监听鸟类对象是否发送移动信号,发送信号就移动窗口位置

    //监听鸟的移动信号connect(this->m_Bird,&Bird::moving,[=](QPoint point){this->move(point);});

4.自动移动

1.创建自动移动点位和定时器

    //自动移动位置QPoint m_Auto_Pos;//自动移动定时器QTimer* timer;

2.获取主屏幕宽度

    //获取屏幕QDesktopWidget* desk=QApplication::desktop();int deskWidth=desk->width();

3.自动移位定时器超时,则将自动移动点位的x坐标加5,不断向右移动【当自动移动点位的x坐标超过主屏幕大小时,将自动移动点位的x坐标设置为鸟类窗口宽度的负数】

    this->timer=new QTimer(this);timer->start(30);//超时后将窗口x坐标加5,不断向右移动,超过主屏幕时,将移动位置设为当前窗口宽度的负数connect(this->timer,&QTimer::timeout,[=]{this->m_Auto_Pos.setX(m_Auto_Pos.x()+5);if(this->m_Auto_Pos.x()>desk->width()){this->m_Auto_Pos.setX(-this->width());}this->move(this->m_Auto_Pos);};

4.将窗口移动到自动移动点位的位置

【优化】上述代码,鼠标按下时,图像也会自由移动,现优化为鼠标按下时,不移动图像

1.添加鼠标是否按下的标识

    //鼠标按下的状态bool mouseDown=false;

2.鼠标按下事件中,将mouseDown置为true,鼠标释放事件中,将mouseDown置为false

void Bird::mouseReleaseEvent(QMouseEvent *e)
{this->mouseDown=false;
}void Bird::mousePressEvent(QMouseEvent *e)
{this->mouseDown=true;this->m_Pox=e->globalPos()-((QWidget*)this->parent())->frameGeometry().topLeft();
}

3.鼠标按下状态mouseDown=false时,才可以自由移动

    //超时后将窗口x坐标加5,不断向右移动,超过主屏幕时,将移动位置设为当前窗口宽度的负数connect(this->timer,&QTimer::timeout,[=]{//鼠标不是按下的状态时,才可以自由移动if(this->m_Bird->mouseDown==false){this->m_Auto_Pos.setX(m_Auto_Pos.x()+5);}if(this->m_Auto_Pos.x()>desk->width()){this->m_Auto_Pos.setX(-this->width());}this->move(this->m_Auto_Pos);};

5.右键菜单

1.创建菜单

    this->m_menu=new QMenu();connect(this->m_menu->addAction("退出"),&QAction::triggered,[=]{exit(0);});

2.鼠标按下后,判断按键,如果是右键,则弹出菜单

void Bird::mousePressEvent(QMouseEvent *e)
{this->mouseDown=true;this->m_Pox=e->globalPos()-((QWidget*)this->parent())->frameGeometry().topLeft();if(e->button()==Qt::RightButton){//将菜单弹到光标位置处this->m_menu->popup(QCursor::pos());}
}

3.菜单如果消失,也要将鼠标按下状态置为false

void Bird::mousePressEvent(QMouseEvent *e)
{this->mouseDown=true;this->m_Pox=e->globalPos()-((QWidget*)this->parent())->frameGeometry().topLeft();if(e->button()==Qt::RightButton){//将菜单弹到光标位置处this->m_menu->popup(QCursor::pos());}//菜单消失后,将鼠标按下状态置为falseconnect(this->m_menu,&QMenu::aboutToHide,[=]{this->mouseDown=false;})
}

6.窗口透明化

1.去掉标题栏

     //去掉标题栏this->setWindowFlags(Qt::FramelessWindowHint);

2.设置透明窗体

    //设置透明窗体this->setAttribute(Qt::WA_TranslucentBackground);

3.窗口设置到顶层(鼠标如果点击,鸟会消失,其实鸟隐藏在页面的下一层,设置之后,鸟永远在页面最顶层,不会消失)

    //窗口设置到顶层(鼠标如果点击,鸟会消失,其实鸟隐藏在页面的下一层,设置之后,鸟永远在页面最顶层,不会消失)this->setWindowFlags(this->windowFlags()|Qt::WindowStaysOnTopHint);

 4.设置起始Y位置,从主窗口中间出现

    //设置起始Y位置,从主窗口中间出现this->m_Auto_Pos.setY(desk->height()*0.5-this->m_Bird->height());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全期末复习

第1章 网络安全概括 &#xff08;1&#xff09;用户模式切换到系统配置模式&#xff08;enable&#xff09;。 &#xff08;2&#xff09;显示当前位置的设置信息&#xff0c;很方便了解系统设置&#xff08;show running-config&#xff09;。 &#xff08;3&#xff09;显…

使用Python实现自动化邮件通知:当长时程序运行结束时

使用Python实现自动化邮件通知&#xff1a;当长时程序运行结束时 前提声明 本代码仅供学习和研究使用&#xff0c;不得用于商业用途。请确保在合法合规的前提下使用本代码。 目录 引言项目背景项目设置代码分析 导入所需模块定义邮件发送函数发送邮件 实现步骤结语全部代码…

Python学习35天

# 定义父类 class Computer: CPUNone MemoryNone diskNone def __init__(self,CPU,Memory,disk): self.disk disk self.Memory Memory self.CPU CPU def get_details(self): return f"CPU:{self.CPU}\tdisk:{self.disk}\t…

Opencv+ROS实现摄像头读取处理画面信息

一、工具 ubuntu18.04 ROSopencv2 编译器&#xff1a;Visual Studio Code 二、原理 图像信息 ROS数据形式&#xff1a;sensor_msgs::Image OpenCV数据形式&#xff1a;cv:Mat 通过cv_bridge()函数进行ROS向opencv转换 cv_bridge是在ROS图像消息和OpenCV图像之间进行转…

LAMP环境的部署

一、软件安装介绍 在Linux系统中安装软件有rpm安装、yum安装、源码安装等方法&#xff0c;在这里主要给大家介绍 yum 安装&#xff0c;这是一种最简单方便的一种安装方法。 YUM&#xff08;Yellow dog Upadate Modifie&#xff09;是改进版的 RPM 管理器&#xff0c;很好地解…

『VUE』elementUI dialog的子组件created生命周期不刷新(详细图文注释)

目录 1. 测试代码分析令人迷惑的效果 分析原因解决方法 如何在dialog中反复触发created呢?总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 主要是在做表单的时候想要有一个编辑表单在dialog弹窗中出现,同时dialog调用的封装的…

项目实战:基于深度学习的人脸表情识别系统设计与实现

大家好&#xff0c;人脸表情识别是计算机视觉领域中的一个重要研究方向&#xff0c;它涉及到对人类情感状态的理解和分析。随着深度学习技术的发展&#xff0c;基于深度学习的人脸表情识别系统因其高精度和强大的特征学习能力而受到广泛关注。本文旨在探讨基于深度学习的人脸表…

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …

Chrome和edge浏览器如何为任何网站强制暗模式

前言 因为我的编辑器是黑色&#xff0c;可能是看的时间长了比较喜欢这种颜色了&#xff0c;感觉白色有些刺眼。尤其是看文章时&#xff0c;两边的空白纯白色&#xff0c;所以强迫症搜素设置了谷歌浏览器和edge如何设置成黑色。 Chrome和edge浏览器如何为任何网站强制暗模式 前…

使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介

作者&#xff1a;来自 Elastic Chema Martinez 在安全领域&#xff0c;能够使用 Windows 主机的系统遥测数据为监控、故障排除和保护 IT 环境开辟了新的可能性。意识到这一点&#xff0c;Elastic 推出了专注于 Windows 事件跟踪 (ETW) 的新功能 - 这是一种强大的 Windows 原生机…

k8s网络服务

k8s 中向外界提供服务的几种方法port-forward、NodePort&#xff0c;以及 更加常用的提供服务的资源ingress。 1 kubectl port-forward service/redis 6379:6379 现在k8s中有一个pod运行在6379&#xff0c;本机访问映射到6379上&#xff0c;它可以针对部署&#xff0c;服务&…

微信小程序按字母顺序渲染城市 功能实现详细讲解

在微信小程序功能搭建中&#xff0c;按字母渲染城市会用到多个ES6的方法&#xff0c;如reduce&#xff0c;map&#xff0c;Object.entries()&#xff0c;Object.keys() &#xff0c;需要组合熟练掌握&#xff0c;才能优雅的处理数据完成渲染。 目录 一、数据分析 二、数据处理 …

前端JavaScript(一)---基本介绍

Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。当时服务端需要对…

git的使用(简洁版)

什么是 Git&#xff1f; Git 是一个分布式版本控制系统 (DVCS)&#xff0c;用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建&#xff0c;最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具&#xff0c;使得开发者…

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…

VS Code前端常用插件

通用类 auto close tag auto rename tag beautify class autocomplete for html Code Runner css peek dash JavaScript Debugger document this eslint font-awesome codes for html filesize git history gitlens html css support HTMLHint htmltagwrap indenticator Intel…

Android 16 开发者预览版抢先使用

Android 16 开发者预览版 获取 Android 16在 Google Pixel 设备上获取 Android 16设置 Android 模拟器 设置 Android 16 SDK获取 Android Studio安装 SDK更新应用的 build 配置 获取 Android 16 你可以通过以下任一方式获取 Android 16 在 Google Pixel 设备上获取 Android 1…

解析生成对抗网络(GAN):原理与应用

目录 一、引言 二、生成对抗网络原理 &#xff08;一&#xff09;基本架构 &#xff08;二&#xff09;训练过程 三、生成对抗网络的应用 &#xff08;一&#xff09;图像生成 无条件图像生成&#xff1a; &#xff08;二&#xff09;数据增强 &#xff08;三&#xff…

docker 安装mysql8.4.0

1、拉取mysql8.4.0镜像 docker pullmysql:8.4.0-oraclelinux8查看镜像 docker images2、新建宿主机本地目录&#xff1a;用来挂载MySQL容器所产生的数据的目录 mkdir -p /home/admin/data/mysql /home/admin/logs/mysql /home/admin/conf/mysql3、在/home/admin/conf/mysql目…

ABAP OOALV模板

自用模板&#xff0c;可能存在问题 一、主程序 *&---------------------------------------------------------------------* *& Report ZVIA_OO_ALV *&---------------------------------------------------------------------* REPORT ZVIA_OO_ALV.INCLUDE ZVI…