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

small bird

 this->setWindowFlags(Qt::FramelessWindowHint);//去掉标题栏//  Translucent   透明化this->setAttribute(Qt::WA_TranslucentBackground);  //窗口透明化//this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);//设置窗口最顶层

this->setWindowIcon(abc);//设置窗口图标

“用鼠标全局坐标的位置减去父窗口的左上角位置”,这正是这段代码所做的。这种计算方式常用于实现拖拽窗口的功能,特别是当窗口没有标准的标题栏时。通过这种方式,你可以确定鼠标相对于父窗口的位置,进而实现拖拽窗口的功能

event->globalPos():
获取鼠标光标在全局坐标系中的位置。
((QWidget*)this->parent())->frameGeometry().topLeft():
获取父窗口左上角的位置。
event->globalPos() - ((QWidget*)this->parent())->frameGeometry().topLeft():
计算鼠标光标在全局坐标系中的位置与父窗口左上角位置之间的差值。
m_pos = ...:
将计算得到的差值赋给 m_pos,m_pos 是一个 QPoint 类型的成员变量,表示鼠标光标相对于父窗口左上角的位置。
void Bird_::mouseMoveEvent(QMouseEvent *event)
{//获取窗口的gai变量this->m_pos= event->globalPos()-this->m_pos;emit aftermove(m_pos);//
}
//((QWidget*)this->parent())->frameGeometry().topLeft();  获取当前窗口左上角的坐标
void Bird_::mousePressEvent(QMouseEvent *event)
{//用鼠标全局坐标的位置减去父窗口的左上角位置m_pos = event->globalPos()   - ((QWidget*)this->parent())->frameGeometry().topLeft();
}

 if(this->auto_pos.x()>QGuiApplication::primaryScreen()->geometry().width())
        {
            this->auto_pos.setX(-this->width());
            //  需要减去一个尺寸从屏幕左边飞过来        //超出屏幕 x设为 窗口的-宽度
        }

当前位置 为屏幕的尺寸的宽度就可  到达最右侧 将 x置为最左侧的-1倍

bird.cpp 及 bird.h

#ifndef BIRD__H
#define BIRD__H#include <QWidget>
#include <QPixmap>//显示图片
#include <QTimer>
#include <QMouseEvent>
#include <QMenu>
class Bird_ : public QWidget
{Q_OBJECT
public:explicit Bird_(QWidget *parent = nullptr);QPixmap m_bird;int min =1;  //最小值图片下标int max = 8;//最大值图片下标  从1切到8实现飞翔的效果QTimer *timer;bool qmousedown =false; //刚开始并没有按下
bool movingRight;QPoint m_pos;//记录当前左边QMenu * menu;virtual void mouseMoveEvent(QMouseEvent *event); //移动事件virtual void mousePressEvent(QMouseEvent *event);//按下事件virtual void mouseReleaseEvent(QMouseEvent *event);
void reverseDirection();void running();
signals:void changepix();//告诉主场景正在改变图片显示  信号不用显示void aftermove(QPoint cc);//拖拽后 主场景移动的位置
};#endif // BIRD__H

bird.cpp

#include "bird_.h"Bird_::Bird_(QWidget *parent): QWidget{parent}
{//需要提前加载图片// m_bird = new QPixmap();for(int i =0 ; i<8;i++){//第一次string  = bird1 第二次bird2QString str = QString("./bird/bird%1").arg(i+1);  //%1占位符   arg用作填补占位this->m_bird.load(str);}this->setFixedSize(this->m_bird.width(),this->m_bird.height());//设置窗口尺寸为图片的高度和宽度timer = new QTimer(this);//监听信号//每隔1秒发送 timeout信号connect(timer,&QTimer::timeout,[this](){QString str = QString("./bird/bird%1").arg(this->min++);this->m_bird.load(str);if(this->min>max){this->min = 1;}//发出信号emit       changepix();});menu = new QMenu;// this->menu->addAction("退出")添加菜单项(退出)//菜单项 trigger信号connect(this->menu->addAction("退出"),&QAction::trigger,[=](){exit(0);});}void Bird_::running()
{timer->start(100);//每隔0.1秒启动 都会发出信号
}void Bird_::mouseMoveEvent(QMouseEvent *event)
{//获取窗口的gai变量this->m_pos= event->globalPos()-this->m_pos;emit aftermove(m_pos);//
}
//((QWidget*)this->parent())->frameGeometry().topLeft();  获取当前窗口左上角的坐标
void Bird_::mousePressEvent(QMouseEvent *event)
{//用鼠标全局坐标的位置减去父窗口的左上角位置m_pos = event->globalPos()   - ((QWidget*)this->parent())->frameGeometry().topLeft();qmousedown = true;if(event->button()==Qt::RightButton){menu->popup(QCursor::pos());//弹出菜单  和鼠标当前的位置意义 方便点击退出}//如果菜单是因为别的方式消失的 那么它继续往前飞//通过任何手段消失发出的信号//&QMenu::aboutToHideconnect(this->menu,&QMenu::aboutToHide,[=](){//改变状态继续往前飞this->qmousedown =false;});
}void Bird_::mouseReleaseEvent(QMouseEvent *event)
{qmousedown = false;}

mainscence.h 及cpp

#ifndef MAINSCENCE_H
#define MAINSCENCE_H#include <QWidget>
#include "bird_.h"
#include <QPainter>
#include <QTimer>
#include <QVector>
QT_BEGIN_NAMESPACE
namespace Ui {
class Mainscence;
}
QT_END_NAMESPACEclass Mainscence : public QWidget
{Q_OBJECTpublic:Mainscence(QWidget *parent = nullptr);~Mainscence();Bird_ *birds;//重写画图事件QPainter *painter;void paintEvent(QPaintEvent *event);//让窗口自动移动QPoint auto_pos;QTimer * timer;
private:Ui::Mainscence *ui;
};
#endif // MAINSCENCE_H

#include "mainscence.h"
#include "ui_mainscence.h"
//主场景
#include <QDesktopServices>
#include <QVector>
Mainscence::Mainscence(QWidget *parent): QWidget(parent), ui(new Ui::Mainscence)
{ui->setupUi(this);this->setWindowTitle("主窗口");QIcon abc("./bird/birdIcon.ico");// QSize(30,30);this->setWindowIcon(abc);//设置窗口图标this->birds = new Bird_(this);//  birds->append(*new Bird_(this));this->setFixedSize(birds->width(),birds->height());this->setAutoFillBackground(1);this->birds->running();  //调用running 启动定时器//监听鸟切图的信号connect(birds,&Bird_::changepix,[=](){update();//手动调用绘图事件// 调用update后会调用   paintEvent});//监听鸟拖拽移动connect(birds,&Bird_::aftermove,[=](QPoint point){this->move(point);auto_pos = point; //鼠标拖拽跟新当前窗口的位置});timer = new QTimer(this);timer->start(30);//QGuiApplication::primaryScreen()->geometry();//qt6中使用这个代替了 qdesktopconnect(timer,&QTimer::timeout,[=](){if(this->birds->qmousedown!=true){this->auto_pos.setX(this->auto_pos.x()+5);  //x坐标加上5像素}  //没有按下就往前飞if(this->auto_pos.x()>QGuiApplication::primaryScreen()->geometry().width()){this->auto_pos.setX(-this->width());//  需要减去一个尺寸从屏幕左边飞过来        //超出屏幕 x设为 窗口的-宽度}//窗口移动this->move(this->auto_pos);});this->setWindowFlags(Qt::FramelessWindowHint);//去掉标题栏//  Translucent   透明化this->setAttribute(Qt::WA_TranslucentBackground);  //窗口透明化//this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);//设置窗口最顶层}Mainscence::~Mainscence()
{delete ui;
}void Mainscence::paintEvent(QPaintEvent *event)
{painter = new QPainter(this);//画图时用 drawPixmappainter->begin(this);painter->drawPixmap(0,0,this->birds->m_bird);//此处画鸟了painter->end();}

  • []:不捕获任何外部变量。
  • [=]:按值捕获所有外部变量。
  • [&]:按引用捕获所有外部变量。
  • 混合使用:可以选择性地按值或按引用捕获特定变量

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot获取resources文件夹下文件并且实现下载
  • 视频懒加载
  • 深入理解 Go 的 init 函数:以 GORM 数据库连接为例
  • [SWPUCTF 2021 新生赛]include
  • Arrays类、Random类和包装类(8大基本数据类型)的用法
  • 加密软件有哪些常见的安全特性
  • Linux驱动开发—设备树分析:GPIO,中断,时钟信息,CPU信息
  • Postgresql数据库中通过函数实现将不确定列的数据插入到表中
  • c++中std::endl 和“\n“ 这两个换行符有什么区别
  • uniapp——列表图片加载太多且空间占用太大的处理方法(降低清晰度)
  • git的基本操作和原理
  • MoE-LLaVA: Mixture of Experts for Large Vision-Language Models
  • Elastic Observability 8.15:AI 助手、OTel 和日志质量增强功能
  • Filebeat+Kafka+ELK
  • RabbitMQ再回首--往事如梦
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【刷算法】求1+2+3+...+n
  • 08.Android之View事件问题
  • ERLANG 网工修炼笔记 ---- UDP
  • Flex布局到底解决了什么问题
  • Java IO学习笔记一
  • Lsb图片隐写
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • TypeScript迭代器
  • ucore操作系统实验笔记 - 重新理解中断
  • yii2中session跨域名的问题
  • 简单易用的leetcode开发测试工具(npm)
  • 山寨一个 Promise
  • 使用 @font-face
  • 突破自己的技术思维
  • 运行时添加log4j2的appender
  • const的用法,特别是用在函数前面与后面的区别
  • zabbix3.2监控linux磁盘IO
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​flutter 代码混淆
  • #《AI中文版》V3 第 1 章 概述
  • (1)Hilt的基本概念和使用
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (Java入门)抽象类,接口,内部类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十六)一篇文章学会Java的常用API
  • (一)Neo4j下载安装以及初次使用
  • ***利用Ms05002溢出找“肉鸡
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET的微型Web框架 Nancy