有时候桌面空空的,或者屏幕空旷了,我们就可以找一点东西来点缀一下,那么桌面宠物是一个不错的选择。
作为一个程序猿,如何实现一个桌面宠物呢?
本文就给大家带来的是如何用qt提供一种思路并写一个简单的桌面宠物。

思路

桌面宠物的动画本质上就是图片的展示

利用qt将自身边框设置为隐藏,并将背景设置为透明。

此时,只需要加入一个控件,然后将其背景改成一个图片。

此时,就做好了最基本的桌面宠物。

如何让它动起来呢?

动画的本质还是图片嘛,我们可以设置一个定时器,然后去切换背景图片,实现动画的手段。

这就是一个基本的,单动画的桌面宠物(想要多动画、随机动作等效果的话,只是更多的资源动画罢了,想要反馈的话,只是触发事件罢了,原理相同)

做法

以 《原神》中的妮露为模型,花神之舞为动画,作为本文的例子。

(当然你可以使用其他的模型和动画。)

对于妮露的模型,本文引用了 https://www.aplaybox.com/details/model/xuBcQCqsVWfC

对于妮露的动作,本文引用了 https://www.aplaybox.com/details/motion/NCjsanWFYLQl

由于要将模型和动画渲染到一起

我选择的方式是先渲染为视频,软件采用的MikuMikuDance(俗称mmd),然后利用ffmpeg将其转换为图片

渲染视频

打开 MikuMikuDance

界面如图所示

然后要加载我们的模型

然后选择你要加载的动作

由于现在还存在网格线、以及影子

我们并不像要,所以要将其关掉

之后在file选项卡下面,选择 render avi to file 选项,导出视频

处理为图片

现在,我们要将其处理为图片

这里需要用到ffmpeg,当然,用其他的也可以。只要可以分割图片即可

请到下列位置下载

https://ffmpeg.org/download.html

同时自己配置环境变量

然后将其转为图片

ffmpeg -i .\2.avi -t 5 -s 640x360 -r 30 ./2/%d.png

现在,就得到了除了好的每一帧的图片

下面开始代码环节

代码

将上述资源导入到qrc中

将窗体设置为边框隐藏、置顶

将背景设置为透明背景

边框隐藏

    setWindowFlag(Qt::FramelessWindowHint);

置顶

    setWindowFlags (windowFlags () | Qt::WindowStaysOnTopHint);

隐藏

    setAttribute(Qt::WA_TranslucentBackground);

欸,窗口为什么不能移动了!

因为你把边框取消了,鼠标拖动里面是没有对于事件的,所以,要设置一下鼠标拖动的事件

void Widget::mousePressEvent(QMouseEvent *event)
{diff_ = event->globalPos() - this->pos();
}void Widget::mouseReleaseEvent(QMouseEvent *event)
{diff_ = QPoint();
}void Widget::mouseMoveEvent(QMouseEvent *event)
{this->move(event->globalPos() - this->diff_);
}

好,现在就可以渲染我们的图片了

这里我偷了一个懒,直接使用了label来当背景板,其实应该自己再绘制一个控件的

因为label的功能支持并不是那么的多。

然后我们利用定时器去循环播放图片即可

    setWindowFlag(Qt::FramelessWindowHint);setWindowFlags (windowFlags () | Qt::WindowStaysOnTopHint);setAttribute(Qt::WA_TranslucentBackground);setMouseTracking(true);setMinimumSize(1400, 1400);auto hlayout = new QHBoxLayout(this);auto l = new QLabel();hlayout->addWidget(l);this->idx = 1;l->setStyleSheet(QString("background: url(:/static/nilu/%1.png) no-repeat;").arg(this->idx));auto time = new QTimer(this);time->setInterval(50);connect(time, &QTimer::timeout, this, [this, l]() {this->idx = (this->idx + 1 ) % 2971 + 1;l->setStyleSheet(QString("background: url(:/static/nilu/%1.png) no-repeat;").arg(this->idx));});time->start();

然后,编译运行,就可以得到我们的“小宠物”了。

当然,也可以是老婆(

tips 文件太大qrc不太好放怎么办?

可以将qrc转成rcc二进制文件,然后放入编译文件夹的目录下。

然后使用 QResource::registerResource("./static.rcc"); 这样的方式来动态加载。

最后

最后的样子么,如图所示

当然了,你还可以写一下多个动作随机切换、待机动作、互动功能

然后,你自己的小宠物(老婆)就出来了。

[amjieker]

用QT实现一个简单的桌面宠物相关推荐

  1. linux qt小型计算器,Qt实现一个简单的计算器

    Qt实现一个简单的计算器 作者:hackett 微信公众号:加班猿 一.UI界面版 运行效果:输入num1和num2选择+-*/点击计算即可 UI界面设计: 3个lineEdit(lineEditNu ...

  2. linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手

    如何在linux下用QT写一个简单的串口调试助手 QT5串口类 在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和 ...

  3. Qt实现一个简单的编译器(软件生成器)

    Qt实现一个简单的编译器(软件生成器) 本文章只记录如何用Qt实现一个简单编译器,即点击本软件中的按钮便可在另一目录中生成一个新的软件(与本软件不冲突). 文章目录 Qt实现一个简单的编译器(软件生成 ...

  4. 使用Qt做一个简单计算器

    title: Calculator date: 2022-09-04 11:10:12 tags: [Qt, 应用, C++] typora-root-url: Calculator 使用Qt做一个简 ...

  5. 用Qt写一个简单的音乐播放器(三):增加界面(播放跳转与音量控制)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  6. QT实现一个简单计算器

    QT实现一个简单计算器 学生一枚,水平有限,如有问题,还望指正 第一步 通过QT设计师绘制出界面图形,界面大致如下: 第二步 将保存的.ui文件转换为头文件,以便于自己创建的对象对其继承和使用 uic ...

  7. Qt 封装一个简单的LED(指示灯)控件

    Qt 封装一个简单的LED(指示灯)控件 1,效果~ 所以 这个简单的LED类可以自定义大小~ 可以点亮或熄灭,也可以闪烁

  8. 使用Qt写一个简单的五子棋单机小游戏

    使用Qt写一个简单的五子棋单机小游戏 刚学,不够专业请勿喷,有不对的地方还请指出,我渴望进步!现在贴出这个游戏我原创的所有代码.希望可以帮到有需要的人. 游戏界面: 因为后面添加了.wav的音频文件, ...

  9. Python开发第一步:如何制作一个简单的桌面应用

    Python开发第一步:如何制作一个简单的桌面应用 前言 大家好,我是baifagg, 一个热爱Python的编程爱好者. 今天我们来学习一下, 如何用Python制作一个简单的桌面应用程序. 虽然桌 ...

  10. 用Qt写一个简单的音乐播放器(六):显示歌词(正则表达式)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

最新文章

  1. Ubuntu18.04+RTX 2080Ti+CUDA 10.0 +cuDNN+PyTorch搭建深度学习环境
  2. (转)写的非常好的一个WPF学习之路
  3. 微信小程序中base64格式的小程序码通过canvas画出来无效
  4. Git安装以及操作过程
  5. 太原未来小使者英语大赛_哥伦比亚2020年中学生“汉语桥”大赛成功在线举办...
  6. au加载默认的输入和输出设备失败_一文带你读懂 C/C++ 语言输入输出流与缓存区...
  7. 【Spring源码】从源码实现的角度解析spring的InitializingBean的afterPropertiesSet方法和init-method区别和应用
  8. 腾讯云Service Mesh生产实践及架构演进
  9. (十一)boost库之多线程间通信
  10. 一次SAP客户访谈记录
  11. 在sublime中直接运行python代码
  12. 几个用于序列化的代码片段
  13. 限流中间件IpRateLimitMiddleware的使用
  14. 化学版2048,你玩过吗?内含游戏链接
  15. codeforces 158A-C语言解题报告
  16. 数据驱动的软件开发者智能协作技术
  17. dell设置从ssd启动_整个活儿:无损迁移系统到SSD过程记录及提升对比
  18. Qt总结之二十三:QByteArray与char、int、float(及其数组)之间的互相转化
  19. [Transformer]A Survey of Transformers-邱锡鹏
  20. 手机python软件哪个好用_如何在手机上学习python编程?有哪些软件可以使用?

热门文章

  1. Postman写接口文档
  2. 王道训练营3月11日
  3. 数字逻辑_逻辑函数化简(配项法)例子
  4. C语言学习—运算符—“~”取反符号的理解
  5. 前端安全问题的解决方法
  6. TS:声明合并de妙处
  7. html5表格制作教程,html怎么做表格
  8. springboot系列(二十六):如何实现word模板单页导出?这你得会|超级详细,建议收藏
  9. Tomcat安装配置(详细步骤)
  10. JavaScript常见的运算符优先级面试题