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

ops/2024/11/29 4:40:15/

目录

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.ppmy.cn/ops/137561.html

相关文章

【04】Selenium+Python 手动添加Cookie免登录(实例)

一、什么是Cookie&#xff1f; Cookie 是一种由服务器创建并保存在用户浏览器中的小型数据文件。它用于存储用户的相关信息&#xff0c;以便在后续访问同一网站时可以快速检索这些信息。Cookie 主要用于以下几个方面&#xff1a; 1.状态管理&#xff1a; Cookie 可以保存用户…

【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)

javascript调用本地exe程序 详细操作步骤结果 详细操作步骤 在本地创建一个txt文件依次输入 1.指明所使用注册表编程器版本 Windows Registry Editor Version 5.00这是脚本的第一行&#xff0c;指明了所使用的注册表编辑器版本。这是必需的&#xff0c;以确保脚本能够被正确解…

数据库和缓存的数据一致性 -20241124

问题描述 一致性 缓存中有数据&#xff0c;缓存的数据值数据库中的值缓存中本没有数据&#xff0c;数据库中的值最新值&#xff08;有请求查询数据库时&#xff0c;会将数据写入缓存&#xff0c;则变为上面的“一致”状态&#xff09; “数据不一致”&#xff1a; 缓存的数据值…

探索 Vue的nextTick :原理剖析、使用场景及代码实践详解

在 Vue 中,$nextTick 是一个非常有用的 API,主要用于在 DOM 更新完成后执行一些操作。它可以确保某些代码在 Vue 完成数据更新和 DOM 渲染后再执行,从而避免因更新延迟导致的问题。 1. $nextTick 的作用 $nextTick 的作用是延迟执行一个回调函数,直到 DOM 更新完成。这通…

Linux系统性能优化技巧

系统性能优化 在当今的信息技术领域&#xff0c;Linux系统的性能优化变得越来越重要。随着Linux操作系统的广泛应用&#xff0c;从桌面环境到大型服务器集群&#xff0c;性能优化不仅可以提升系统的响应速度和吞吐量&#xff0c;还能降低资源消耗&#xff0c;从而延长硬件使用…

【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)

深度极限学习机 (DELM) 作为一种新型的深度学习算法&#xff0c;凭借其独特的结构和训练方式&#xff0c;在诸多领域展现出优异的性能。本文将重点探讨DELM在多输入单输出 (MISO) 场景下的应用&#xff0c;深入分析其算法原理、性能特点以及未来发展前景。 1、 DELM算法原理及其…

大模型并行:TP, PP, DP,MP

目录 大模型并行:TP, PP, DP,MP 张量并行(TP) 数据并行(DP) 模型并行(MP) 流水线并行(PP) TP:张量模型并行 一、定义与基本原理 二、切分方式 三、主要优势与挑战 优势 挑战 四、应用场景 五、注意事项 大模型并行:TP, PP, DP,MP 数据并行(Data Pa…

2024 年河北省职业院校技能大赛网络建设与运维赛项样题五

2024 年河北省职业院校技能大赛网络建设与运维赛项 赛题 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为模块一:网络理论测试&#x