Qt/C++桌面宠物应用代码讲解(附工程源码下载)
本篇文章将详细讲解如何使用 Qt/C++ 开发一个简单的桌面宠物应用程序。此应用程序的主要功能包括:显示动态宠物、支持拖动和点击、模板切换、随机疯癫模式以及通过系统托盘图标进行控制。我们将逐步分析代码中的关键部分,并解释其实现原理。
工程源码
通过网盘分享的文件:桌面宠物 链接: https://pan.baidu.com/s/1FsSBFtXU9J1ZD8cfNxDukg?pwd=jkcf 提取码: jkcf
cpp
运行
该桌面宠物应用程序的核心功能是:
动态显示宠物图像(通过GIF动画和PNG静态图像)。支持鼠标拖动,使用户可以随意移动宠物。提供模板切换功能,用户可以通过系统托盘菜单更换宠物的外观。提供随机疯癫模式,宠物会随机移动到屏幕上的不同位置。系统托盘图标功能,让用户可以通过右键菜单隐藏、显示、切换模板或启动疯癫模式。 2. 关键代码讲解 a. 构造函数:初始化界面和组件构造函数是应用程序初始化的核心,主要完成了以下几项任务:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget), petLabel(new QLabel(this)), currentGif(new QMovie(this)), moveTimer(new QTimer(this)), trayIcon(new QSystemTrayIcon(this)), trayMenu(new QMenu(this)), currentTemplateIndex(0) { ui->setupUi(this); // 设置无边框、始终在顶层和不显示在任务栏 setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); // 初始化宠物 QLabel petLabel->setScaledContents(true); petLabel->setFixedSize(128, 128); petLabel->move(0, 0); // 初始化模板集合 initTemplates(); // 初始化当前模板 updateTemplate(); // 启动随机移动定时器 connect(moveTimer, &QTimer::timeout, this, &Widget::randomMove); // 设置系统托盘图标和菜单 setupTrayIcon(); }
cpp
运行
窗口设置:通过 setWindowFlags 和 setAttribute 方法,应用程序的窗口被设置为无边框、始终位于顶层并且不显示在任务栏中,同时支持透明背景。宠物标签初始化:宠物使用 QLabel 来显示图像,并设置为固定大小(128x128),以及使图片按照标签的大小缩放。模板初始化:调用 initTemplates() 方法来加载宠物的多个模板,并确保每个模板的资源文件(GIF 和 PNG)存在。定时器初始化:通过 QTimer 启动随机移动定时器,以实现宠物的疯狂移动。托盘图标设置:通过 QSystemTrayIcon 设置应用程序的系统托盘图标和菜单。 b. 模板初始化(initTemplates)void Widget::initTemplates() { QDir templateDir("templates"); // 检查目录是否存在 if (!templateDir.exists()) return; // 获取模板子目录列表 QFileInfoList subDirs = templateDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); // 遍历每个子目录,初始化模板 for (const QFileInfo &dirInfo : subDirs) { QDir subDir(dirInfo.absoluteFilePath()); PetTemplate pet; // 构造模板资源路径 pet.gifPath = subDir.filePath("pet.gif"); pet.png1Path = subDir.filePath("1.gif"); pet.png2Path = subDir.filePath("2.gif"); // 检查资源文件是否存在 if (QFile::exists(pet.gifPath) && QFile::exists(pet.png1Path) && QFile::exists(pet.png2Path)) { templates.append(pet); // 添加到模板列表 } } if (templates.isEmpty()) qApp->quit(); }
cpp
运行
模板目录扫描:通过 QDir 类扫描 templates 目录中的子目录,每个子目录代表一个宠物模板。资源文件检查:每个模板目录下必须包含 pet.gif、1.gif 和 2.gif 这三种资源文件,如果文件存在,就将该模板加入到模板列表中。应用退出:如果没有任何有效模板,程序将退出。 c. 模板更新(updateTemplate)void Widget::updateTemplate() { if (currentTemplateIndex >= templates.size()) return; const PetTemplate &templateData = templates[currentTemplateIndex]; currentGif->stop(); currentGif->setFileName(templateData.gifPath); petLabel->setMovie(currentGif); currentGif->start(); }
cpp
运行
该方法负责更新当前显示的宠物模板。通过 currentTemplateIndex 来选择模板并更新宠物的 GIF 动画。
d. 系统托盘图标和菜单(setupTrayIcon)void Widget::setupTrayIcon() { // 初始化托盘菜单动作 showAction = new QAction(tc("显示"), this); hideAction = new QAction(tc("隐藏"), this); quitAction = new QAction(tc("退出"), this); switchTemplateAction = new QAction(tc("模板切换"), this); switchMode = new QAction(tc("疯癫模式"), this); connect(showAction, &QAction::triggered, this, &Widget::onShowWindow); connect(hideAction, &QAction::triggered, this, &Widget::onHideWindow); connect(quitAction, &QAction::triggered, QApplication::quit); connect(switchTemplateAction, &QAction::triggered, this, &Widget::onSwitchTemplate); connect(switchMode, &QAction::triggered, this, [=](){moveTimer->start(100);}); // 添加动作到托盘菜单 trayMenu->addAction(showAction); trayMenu->addAction(hideAction); trayMenu->addAction(switchTemplateAction); trayMenu->addAction(switchMode); trayMenu->addSeparator(); trayMenu->addAction(quitAction); // 配置托盘图标 trayIcon->setIcon(QIcon("tray_icon.png")); // 替换为托盘图标路径 trayIcon->setContextMenu(trayMenu); trayIcon->setVisible(true); }
cpp
运行
托盘菜单操作:为系统托盘菜单创建了多个动作,如显示、隐藏、退出、切换模板和疯癫模式。托盘图标设置:设置托盘图标为 tray_icon.png,并将菜单与托盘图标绑定。 e. 鼠标拖动事件void Widget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { dragPosition = event->globalPos() - frameGeometry().topLeft(); petLabel->setPixmap(QPixmap(templates[currentTemplateIndex].png1Path)); // 显示 PNG1 event->accept(); } } void Widget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { move(event->globalPos() - dragPosition); petLabel->setPixmap(QPixmap(templates[currentTemplateIndex].png2Path)); // 显示 PNG2 event->accept(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { petLabel->setMovie(currentGif); // 恢复 GIF currentGif->start(); event->accept(); } }
cpp
运行
这些事件处理方法使得用户可以通过点击并拖动来移动宠物。当鼠标按下时,宠物显示一张静态图像(PNG1);在鼠标拖动时,宠物切换为另一张图像(PNG2);鼠标释放时,宠物恢复为 GIF 动画。
3. 总结通过这个项目,我们学会了如何使用 Qt 进行桌面宠物应用的开发,涵盖了以下几个核心概念:
使用 QLabel 和 QMovie 显示和播放动画。使用 QTimer 实现随机移动的功能。使用 QSystemTrayIcon 实现系统托盘图标和菜单功能。利用鼠标事件处理实现宠物的拖动操作。这个简单的桌面宠物程序,不仅实现了基础的动态显示和互动功能,还通过托盘菜单为用户提供了更为方便的控制方式。
相关知识
【C/C++技术教学】Qt自制桌面宠物!思路分析+代码演示丨程序员教你如何把喜欢的角色做成随便把玩的桌面宠物!
【QT项目实战】自制桌面宠物!当我学了qt窗口开发之后,就把原神的纳西妲做成了桌面宠物!
【C语言/C++】桌面宠物开发(纳西妲)!程序员教你如何把喜欢的角色做成随便把玩的桌面宠物,源码可分享!
Qt实现的宠物小精灵对战游戏阶段二
C/C++趣味项目:三国杀!大一计算机练习实战必备(附源码+素材)带你一步步从零做出一个小游戏!
【附源码】用Python代码,制作出一只专属桌面宠物,确定不来一只?保姆级教程,小白也能学会!!
【QT/C++】自制一只你的专属宠物,桌面体验感升级100%!零基础小白级操作,不怕你不会!
朝阳公园的酷迪宠物乐园
【附源码】教你用Python代码制作一只你的专属宠物,桌面体验感升级100%!!
C语言实战案例:超市管理系统与QQ桌面宠物
网址: Qt/C++桌面宠物应用代码讲解(附工程源码下载) https://www.mcbbbk.com/newsview1223393.html
上一篇: 宠物QQ新版 删除 |
下一篇: QQ宠物图标100级在QQ上显示 |
推荐分享

- 1养玉米蛇的危害 28694
- 2狗交配为什么会锁住?从狗狗生 7180
- 3我的狗老公李淑敏33——如何 6236
- 4豆柴犬为什么不建议养?可爱的 4637
- 5南京宠物粮食薄荷饼宠物食品包 4563
- 6中国境内禁养的十大鸟种,你知 4429
- 7湖南隆飞尔动物药业有限公司宠 4259
- 8自制狗狗辅食:棉花面纱犬的美 4257
- 9家养水獭多少钱一只正常 4212
- 10广州哪里卖宠物猫狗的选择性多 4122