一、简述

最近用了项目需要写了个极简的报警提示小控件,有正常、报警震动、勿扰三种状态切换,主要是加了个震动的小动画效果,代码也很简单,需要的小伙伴直接copy即可。

二、代码之路

BellWidget.h

#include <QWidget>
#include <QPropertyAnimation>enum BellState
{BellNormal,     // 正常;BellAlarm,      // 报警;BellMute        // 静音;
};class BellWidget : public QWidget
{Q_OBJECTpublic:BellWidget(QWidget *parent = Q_NULLPTR);// 设置/获取 当前是否报警;void setIsAlarm(bool isAlarm);bool getIsAlarm();// 设置铃铛状态;void setBellState(BellState bellState);// 设置当前摇铃角度范围;void setShakeAngle(int angle);// 设置摇铃频率;void setShakeFrequency(int frequency);private:void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *event);signals:// 发送点击铃铛信号;void signalBellClicked();private:// 变换角度;int m_bellAngle;QPropertyAnimation *m_moveAnimation;bool m_isAlarm;int m_shakeAngle;int m_shakeFrequency;BellState m_bellState;
};

BellWidget.cpp

#include "BellWidget.h"
#include <QPainter>
#include <QMouseEvent>BellWidget::BellWidget(QWidget *parent): QWidget(parent), m_isAlarm(false), m_shakeAngle(15), m_shakeFrequency(150), m_bellState(BellNormal)
{m_moveAnimation = new QPropertyAnimation(this, "");m_moveAnimation->setDuration(m_shakeFrequency);m_moveAnimation->setEasingCurve(QEasingCurve::Linear);m_moveAnimation->setStartValue(m_shakeAngle);m_moveAnimation->setEndValue(-m_shakeAngle);connect(m_moveAnimation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value) {m_bellAngle = value.toInt();update();});connect(m_moveAnimation, &QPropertyAnimation::finished, this, [=] {QAbstractAnimation::Direction dir = m_moveAnimation->direction();if (dir == QAbstractAnimation::Forward){m_moveAnimation->setDirection(QAbstractAnimation::Backward);}else if (dir == QAbstractAnimation::Backward){m_moveAnimation->setDirection(QAbstractAnimation::Forward);}m_moveAnimation->start();update();});this->setFixedSize(QSize(80, 80));connect(this, &BellWidget::signalBellClicked, this, [=] {this->setIsAlarm(!this->getIsAlarm());});}void BellWidget::setIsAlarm(bool isAlarm)
{m_isAlarm = isAlarm;if (isAlarm){m_moveAnimation->start();setBellState(BellAlarm);}else{m_moveAnimation->stop();setBellState(BellNormal);}
}bool BellWidget::getIsAlarm()
{return m_isAlarm;
}void BellWidget::setBellState(BellState bellState)
{m_bellState = bellState;update();
}void BellWidget::setShakeAngle(int angle)
{m_shakeAngle = angle;m_moveAnimation->setStartValue(m_shakeAngle);m_moveAnimation->setEndValue(-m_shakeAngle);
}void BellWidget::setShakeFrequency(int frequency)
{m_shakeFrequency = frequency;m_moveAnimation->setDuration(m_shakeFrequency);
}void BellWidget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::SmoothPixmapTransform);// 为了防止绘制铃铛pixmap摇晃时不出边界,加了border;// 此处border需要根据控件大小进行调整;int border = 20;switch (m_bellState){case BellNormal:{painter.drawPixmap(this->rect().adjusted(border, 0, -border, -0), QPixmap(":/Resources/BellNormal.png"));}break;case BellAlarm:{painter.translate(this->rect().center());painter.rotate(m_bellAngle);painter.translate(-this->rect().center());painter.drawPixmap(this->rect().adjusted(border, 0, -border, 0), QPixmap(":/Resources/BellAlarm.png"));}break;case BellMute:{painter.drawPixmap(this->rect().adjusted(border, 0, -border, -0), QPixmap(":/Resources/BellMute.png"));}break;default:break;}
}void BellWidget::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton){emit signalBellClicked();}else if (event->button() == Qt::RightButton){setBellState(BellMute);}
}

Qt小程序之自绘震动铃铛提示控件相关推荐

  1. 微信小程序,视频播放,隐藏默认播放控件

    微信原生写 <video src="" autoplay="{{true}}" controls="{{false}}" loop=& ...

  2. 解决uniapp小程序打包体积超过2M,提示包体积超过2M,“main packagexxx”,不给上传和预览的解决办法,绝对有效

    解决办法,原文地址: 解决uniapp小程序打包体积超过2M,提示包体积超过2M,"main packagexxx",不给上传和预览的解决办法,绝对有效!在微信小程序开发中,为了解 ...

  3. 微信小程序授权登录页面(有提示窗)

    微信小程序授权登录(有弹窗提示) 1 效果显示 1.1 授权登录页面 1.2 授权登录提示弹窗 1.3 拒绝授权登录 1.4 允许登录后,跳转到小程序首页 2 代码 2.1 wxml 文件 <v ...

  4. 微信小程序版本自动更新用户感知提示方案总结

    微信小程序版本自动更新用户感知提示方案总结 需求背景 最近基于uniapp开发微信小程序上线后,在迭代版本后期望自动更新提示. 使感知. 解决方案 使用全局唯一的对象: updateManager. ...

  5. QT实现Qt Quick和three.js渲染和实现QML3D控件

    QT实现Qt Quick和three.js渲染和实现QML3D控件 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 结合Qt Quick和three.js渲染. 演示 ...

  6. Qt QWidget实现消息提示控件TipsWidget

    前言 用Qt实现一个消息提示控件,控件宽度会根据显示的内容多少来动态伸展,控件显示三秒钟过后会自动渐变透明度然后最终消失,这有点类似于Android的Toast控件,都是用于消息短暂提示. 源码 头文 ...

  7. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  8. VS2010/MFC对话框程序调用Windows Media Player播放器控件

    MFC对话框程序调用Windows Media Player播放器控件播放打开的avi格式的文件,具体步骤如下: 1.根据MFC向导提示,创建一个默认的对话框项目TestMediaPlayer. 2. ...

  9. 【QT开发笔记-基础篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget

    本节对应的视频讲解:B_站_链_接 QTableWidget 是 Qt 中的表格控件,可以行列的形式来展示数据 1. 属性和方法 QTableWidget 有很多属性和方法,完整的可查看帮助文档. 在 ...

最新文章

  1. Linux进程在后台运行的几种方法
  2. html中两行三列怎样写,html – Flexbox 3 divs,两列,一列有两行
  3. 报错:Navicat for MySQL 连接MySQL 8.0 出现1130错误
  4. Day 06 元组,字典,集合
  5. FZU 1894 志愿者选拔
  6. Win CE下编译选项介绍
  7. windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...
  8. 计算机组成原理实验串行口,计算机组成原理实验2.ppt
  9. 16. CSS 轮廓
  10. Windows快速更改IP脚本
  11. 向云再出发:如数据般飞驰的内蒙古
  12. xp计算机u盘重装系统,u启动一键u盘安装原版XP系统教程_u启动
  13. 9、mysql三表连接查询简单语句
  14. OSChina 周二乱弹 —— 掏心掏肺又掏钱,最终娶了个潘金莲
  15. Word双栏和单栏的转换
  16. opencv立方体的画法_【不看后悔!】最详细的立方体透视变化及画法讲解
  17. MySQL是做什么的
  18. 微博、信息披露与分析师盈余预测
  19. unity制作一款塔防游戏
  20. fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏

热门文章

  1. Docker的上手(Ubuntu140.4 Mate)
  2. 后台cs代码控制html控件,在asp.net中*.aspx.cs肿么用后台代码编写前台的事件?
  3. TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体,
  4. 2021年想转行产品经理,应该如何入门?
  5. Git工作原理_繁星漫天_新浪博客
  6. python中文分词,生成标签云,生成指定形状图片标签云
  7. mac 平台显示歌词最好的音乐播放器软件 —— Vox + LyricsX
  8. 思源字体的安装和使用
  9. 锐捷交换机删除vlan
  10. STM32 HAL库之看门狗