基于qt的桌面宠物——纳西妲源码纯享

本专栏会不定时更新,如果有有趣的C++代码或者编程可以在评论区留言,我会尽量满足粉丝的要求,同时还希望看到的朋友点个赞/收藏(感谢/感谢)

代码

main.cpp:

#include "widget.h"#include <QApplication>
#include<QSystemTrayIcon>
#include<QIcon>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;QSystemTrayIcon sysTray(QIcon("://img/icon.png"),&w);QMenu menu;auto showAct=new QAction("show",&sysTray);auto exitAct=new QAction("exit",&sysTray);QObject::connect(showAct,&QAction::triggered,[&](){w.setVisible(true);});QObject::connect(exitAct,&QAction::triggered,[&](){QApplication::quit();});menu.addAction(showAct);menu.addAction(exitAct);sysTray.setContextMenu(&menu);sysTray.show();w.show();return a.exec();
}

widget.h:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QMap>
#include<QList>
#include<QUrl>
#include<QTimer>
#include<QEvent>
#include<QMouseEvent>
#include<QContextMenuEvent>
#include<QMenu>class QPaintEvent;namespace Act {
Q_NAMESPACEenum RoleAct{Swing,Sleep,SayHello
};
Q_ENUM_NS(RoleAct)}using namespace  Act ;class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public:void showActAnimation(RoleAct k);public slots:void onMenuTriggered(QAction* action);protected:void paintEvent(QPaintEvent* event)override;void contextMenuEvent(QContextMenuEvent* event);private:void loadRoleActRes();void initMenu();private:QMap<RoleAct,QList<QUrl>> action_map;QTimer* timer;RoleAct cur_role_act;QUrl cur_role_pix;QMenu* menu;
};class DragFilter:public QObject{public:bool eventFilter(QObject* obj,QEvent* event){auto w=dynamic_cast<QWidget*>(obj);if(!w)return false;if(event->type()==QEvent::MouseButtonPress){auto e=dynamic_cast<QMouseEvent*>(event);if(e){pos=e->pos();}}else if(event->type()==QEvent::MouseMove){auto e=dynamic_cast<QMouseEvent*>(event);if(e){if(e->buttons()&Qt::MouseButton::LeftButton){w->move(e->globalPos()-pos);}}}return QObject::eventFilter(obj,event);}private:QPoint pos;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include<QPaintEvent>
#include<QPainter>//绘图
#include<QPixmap>//图片
#include<QCursor>
#include<QMetaEnum>Widget::Widget(QWidget *parent): QWidget(parent),timer(new QTimer(this)),menu(new QMenu(this))
{this->setWindowFlag(Qt::FramelessWindowHint);//去除窗口边框this->setAttribute(Qt::WA_TranslucentBackground);//背景透明this->installEventFilter(new DragFilter);connect(timer,&QTimer::timeout,[this](){static int index=0;//记录显示动作的当前图片索引auto paths = this->action_map.value(this->cur_role_act);this->cur_role_pix=paths[index++ % paths.size()];//paintEvent() 不允许的this->update();});initMenu();loadRoleActRes();showActAnimation(RoleAct::Swing);
}Widget::~Widget() {}void Widget::showActAnimation(RoleAct k)
{timer->stop();this->cur_role_act=k;timer->start(60);
}void Widget::onMenuTriggered(QAction *action)
{QMetaEnum me=QMetaEnum::fromType<RoleAct>();bool ok;int k =  me.keyToValue(action->text().toStdString().c_str(),&ok);if(!ok)return;showActAnimation(static_cast<RoleAct>(k));
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPixmap pix;pix.load(this->cur_role_pix.toLocalFile());painter.drawPixmap(0,0,pix);}void Widget::contextMenuEvent(QContextMenuEvent *event)
{this->menu->popup(QCursor::pos());
}void Widget::loadRoleActRes()
{auto addRes=[this](RoleAct k,QString path,int count){QList<QUrl> paths;char buf[260];for (int i = 0; i < count; ++i) {memset(buf, 0,sizeof(buf));sprintf_s(buf,path.toStdString().c_str(),i);paths.append(QUrl::fromLocalFile(buf));}action_map.insert(k,paths);};addRes(RoleAct::SayHello,"D:/001/pet/img/sayHello/sayHello_%d.png",28);addRes(RoleAct::Swing,"D:/001/pet/img/swing/swing_%d.png",32);addRes(RoleAct::Sleep,"D:/001/pet/img/sleep/sleep_%d.png",25);
}void Widget::initMenu()
{menu->addAction("SayHello");menu->addAction("Sleep");menu->addAction("Swing");QAction* act=new QAction("Hide");connect(act,&QAction::triggered,[this](){this->setVisible(false);});menu->addAction(act);connect(this->menu,&QMenu::triggered,this,&Widget::onMenuTriggered);
}

演示:

右键会出现四个选项:

点击相应图标会有不同动作。

sleep:

hello:

打包参考文章:Qt程序发布完整教程以及打包成exe文件【小白版】_qt发布可执行程序-CSDN博客

需要代码的可以评论区留言,私聊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28519.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用于管理 Elasticsearch Serverless 项目的 AI Agent

作者&#xff1a;来自 Elastic Fram Souza 由自然语言驱动的 AI 代理&#xff0c;可轻松管理 Elasticsearch Serverless 项目 - 支持项目创建、删除和状态检查。 这个小型命令行工具让你可以用简单的英语管理你的无服务器 Elasticsearch 项目。它通过AI&#xff08;这里是 Ope…

C语言_图书管理系统_借阅系统管理

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 小伞的主页&#xff1a;xiaosan_blog 本文所需对顺序表的理解&#xff1a; 注&#xff1a;由于顺序表实现图书…

车辆运维管理行业洞察与竞品分析

1. 前言 车辆运维管理是指对车辆进行日常维护、故障处理、性能监测、成本控制等一系列活动的管理。随着物联网、大数据、人工智能等技术的发展&#xff0c;车辆运维管理软件和解决方案的市场竞争日益激烈。 2. 确定目标 通过产品差异化定位&#xff0c;找到竞争者的差异&…

Spring源码分析のAOP

文章目录 前言一、wrapIfNecessary1.1、getAdvicesAndAdvisorsForBean1.1.1、findCandidateAdvisors1.1.2、findAdvisorsThatCanApply 1.2、createProxy 二、invoke2.1、getInterceptorsAndDynamicInterceptionAdvice2.1.1、getInterceptors 2.2、proceed2.2.1、invoke 三、Asp…

LINUX网络基础 [一] - 初识网络,理解网络协议

目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型&#xff08;理论标准&#xff09; …

React学习笔记10

一、Redux与React-提交action传参 需求&#xff1a;组件中有两个按钮&#xff0c;点击add to 10和add to 20将count的值修改到对应的数字&#xff0c;目标count值是在组件中传递过去的&#xff0c;需要提交action的时候传递参数 实现思路&#xff1a;在reducers的同步修改方法中…

Docker概念与架构

文章目录 概念docker与虚拟机的差异docker的作用docker容器虚拟化 与 传统虚拟机比较 Docker 架构 概念 Docker 是一个开源的应用容器引擎。诞生于 2013 年初&#xff0c;基于 Go 语言实现。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xf…

HarmonyOS Next~应用开发入门:从架构认知到HelloWorld实战

HarmonyOS应用开发入门&#xff1a;从架构认知到HelloWorld实战 一、HarmonyOS架构解析 1.1 分布式能力三要素 &#xff08;1&#xff09;软总线&#xff08;SoftBus&#xff09; HarmonyOS的核心神经中枢&#xff0c;通过统一的分布式通信协议实现设备间的自动发现和组网。…

相控阵扫盲

下图展示天线增益 在仰角为0度的情况下随着方位角的变化而变化。需要注意到的是在天线视轴方向上的高增益主瓣上还有几个低增益旁瓣 阵列因子乘以新的阵元方向图会形成指向性更强的波速

[QT]开发全解析:从概念到实战

文章目录 Qt 框架入门与应用开发指南一、Qt 框架概述1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt 的应用场景1.7 Qt 的成功案例 二、Qt 的开发工具概述Qt CreatorVisual StudioEclipse 三、认识 Qt Creator3.1 Qt Creator 概览3.2 使用 Qt C…

LeetCode 718.最长重复子数组(动态规划,Python)

给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。 示例 2&#xff1a; 输…

从厨电模范到数字先锋,看永洪科技如何助力方太集团开启数字新征程

在数字化洪流席卷全球的宏大背景下&#xff0c;企业转型升级的紧迫性与重要性日益凸显&#xff0c;成为驱动行业进步的关键引擎。在这一波澜壮阔的转型浪潮中&#xff0c;方太集团——厨电领域的璀璨明珠&#xff0c;以其前瞻性的战略视野和不懈的创新精神&#xff0c;携手数据…

C++11中atomic

C11中atomic 在C中&#xff0c;std::atomic 是一个非常重要的工具&#xff0c;主要用于实现线程安全的操作。它属于C11标准引入的 <atomic> 头文件的一部分&#xff0c;用于处理多线程环境下的原子操作。以下是 std::atomic 的主要作用和特点&#xff1a; 1. 保证操作的…

尚庭公寓项目记录

数据库准备 保留图像时&#xff0c;保存图像地址就可以数据表不是越多越好&#xff0c;可以用中间表来实现俩个表之间的联立这样方便查数据但是却带来性能问题而减少表的jion但是提高性能&#xff0c;以冗余来换去性能采用MySQL&#xff0c;InnoDB存储引擎物理删除和逻辑删除逻…

unity6 打包webgl注意事项

webgl使用资源需要异步加载 使用localization插件时要注意&#xff0c;webgl不支持WaitForCompletion&#xff0c;LocalizationSettings.InitializationOperation和LocalizationSettings.StringDatabase.GetTable都不能用 web里想要看到具体的报错信息调试开启这两个&#xf…

wxWidgets GUI 跨平台 入门学习笔记

准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…

C++20 中使用括号进行聚合初始化:新特性与实践指南

文章目录 1. 聚合初始化简介2. C20 中的括号聚合初始化2.1 指定初始化器&#xff08;Designated Initializers&#xff09;2.2 嵌套聚合初始化 3. 使用括号初始化数组4. 注意事项5. 实际应用场景6. 总结 在 C20 中&#xff0c;聚合初始化&#xff08;Aggregate Initialization&…

TomcatServlet

https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图&#xff0c;与 jre&#xff0c;应用程序之前的关系 安装使用 tomcat 10 开始&#xff0c;api 从 javax.* 转为使用 jakarta.*&#xff0c;需要至少使用 jdk 11 cmd 中默认 gbk 编码&#xff0c;解决控制…

android接入rocketmq

一 前言 RocketMQ 作为一个功能强大的消息队列系统&#xff0c;不仅支持基本的消息发布与订阅&#xff0c;还提供了顺序消息、延时消息、事务消息等高级功能&#xff0c;适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具&#xff0c;以及安全控制…

有关Java中的集合(1):List<T>和Set<T>

学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点&#xff1a;有序表示存取有序&#xff08;因为有索引&#xff09;而且可以重复 ● List常用实现类&#xff1a; ArrayList、LinkedList、Vector等 1.1 常用方法…