Qt/C++桌面宠物应用代码讲解(附工程源码下载)

本篇文章将详细讲解如何使用 Qt/C++ 开发一个简单的桌面宠物应用程序。此应用程序的主要功能包括:显示动态宠物、支持拖动和点击、模板切换、随机疯癫模式以及通过系统托盘图标进行控制。我们将逐步分析代码中的关键部分,并解释其实现原理。

工程源码

通过网盘分享的文件:桌面宠物
链接: https://pan.baidu.com/s/1FsSBFtXU9J1ZD8cfNxDukg?pwd=jkcf 提取码: jkcf

1. 项目概述

该桌面宠物应用程序的核心功能是:

  • 动态显示宠物图像(通过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();
}
  1. 窗口设置:通过 setWindowFlagssetAttribute 方法,应用程序的窗口被设置为无边框、始终位于顶层并且不显示在任务栏中,同时支持透明背景。
  2. 宠物标签初始化:宠物使用 QLabel 来显示图像,并设置为固定大小(128x128),以及使图片按照标签的大小缩放。
  3. 模板初始化:调用 initTemplates() 方法来加载宠物的多个模板,并确保每个模板的资源文件(GIF 和 PNG)存在。
  4. 定时器初始化:通过 QTimer 启动随机移动定时器,以实现宠物的疯狂移动。
  5. 托盘图标设置:通过 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();
}
  • 模板目录扫描:通过 QDir 类扫描 templates 目录中的子目录,每个子目录代表一个宠物模板。
  • 资源文件检查:每个模板目录下必须包含 pet.gif1.gif2.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();
}

该方法负责更新当前显示的宠物模板。通过 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);
}
  • 托盘菜单操作:为系统托盘菜单创建了多个动作,如显示、隐藏、退出、切换模板和疯癫模式。
  • 托盘图标设置:设置托盘图标为 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();
    }
}

这些事件处理方法使得用户可以通过点击并拖动来移动宠物。当鼠标按下时,宠物显示一张静态图像(PNG1);在鼠标拖动时,宠物切换为另一张图像(PNG2);鼠标释放时,宠物恢复为 GIF 动画。

3. 总结

通过这个项目,我们学会了如何使用 Qt 进行桌面宠物应用的开发,涵盖了以下几个核心概念:

  • 使用 QLabelQMovie 显示和播放动画。
  • 使用 QTimer 实现随机移动的功能。
  • 使用 QSystemTrayIcon 实现系统托盘图标和菜单功能。
  • 利用鼠标事件处理实现宠物的拖动操作。

这个简单的桌面宠物程序,不仅实现了基础的动态显示和互动功能,还通过托盘菜单为用户提供了更为方便的控制方式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客晨风

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值