Qt小程序之自绘震动铃铛提示控件
一、简述
最近用了项目需要写了个极简的报警提示小控件,有正常、报警震动、勿扰三种状态切换,主要是加了个震动的小动画效果,代码也很简单,需要的小伙伴直接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小程序之自绘震动铃铛提示控件相关推荐
- 微信小程序,视频播放,隐藏默认播放控件
微信原生写 <video src="" autoplay="{{true}}" controls="{{false}}" loop=& ...
- 解决uniapp小程序打包体积超过2M,提示包体积超过2M,“main packagexxx”,不给上传和预览的解决办法,绝对有效
解决办法,原文地址: 解决uniapp小程序打包体积超过2M,提示包体积超过2M,"main packagexxx",不给上传和预览的解决办法,绝对有效!在微信小程序开发中,为了解 ...
- 微信小程序授权登录页面(有提示窗)
微信小程序授权登录(有弹窗提示) 1 效果显示 1.1 授权登录页面 1.2 授权登录提示弹窗 1.3 拒绝授权登录 1.4 允许登录后,跳转到小程序首页 2 代码 2.1 wxml 文件 <v ...
- 微信小程序版本自动更新用户感知提示方案总结
微信小程序版本自动更新用户感知提示方案总结 需求背景 最近基于uniapp开发微信小程序上线后,在迭代版本后期望自动更新提示. 使感知. 解决方案 使用全局唯一的对象: updateManager. ...
- QT实现Qt Quick和three.js渲染和实现QML3D控件
QT实现Qt Quick和three.js渲染和实现QML3D控件 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 结合Qt Quick和three.js渲染. 演示 ...
- Qt QWidget实现消息提示控件TipsWidget
前言 用Qt实现一个消息提示控件,控件宽度会根据显示的内容多少来动态伸展,控件显示三秒钟过后会自动渐变透明度然后最终消失,这有点类似于Android的Toast控件,都是用于消息短暂提示. 源码 头文 ...
- SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...
做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...
- VS2010/MFC对话框程序调用Windows Media Player播放器控件
MFC对话框程序调用Windows Media Player播放器控件播放打开的avi格式的文件,具体步骤如下: 1.根据MFC向导提示,创建一个默认的对话框项目TestMediaPlayer. 2. ...
- 【QT开发笔记-基础篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget
本节对应的视频讲解:B_站_链_接 QTableWidget 是 Qt 中的表格控件,可以行列的形式来展示数据 1. 属性和方法 QTableWidget 有很多属性和方法,完整的可查看帮助文档. 在 ...
最新文章
- Linux进程在后台运行的几种方法
- html中两行三列怎样写,html – Flexbox 3 divs,两列,一列有两行
- 报错:Navicat for MySQL 连接MySQL 8.0 出现1130错误
- Day 06 元组,字典,集合
- FZU 1894 志愿者选拔
- Win CE下编译选项介绍
- windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...
- 计算机组成原理实验串行口,计算机组成原理实验2.ppt
- 16. CSS 轮廓
- Windows快速更改IP脚本
- 向云再出发:如数据般飞驰的内蒙古
- xp计算机u盘重装系统,u启动一键u盘安装原版XP系统教程_u启动
- 9、mysql三表连接查询简单语句
- OSChina 周二乱弹 —— 掏心掏肺又掏钱,最终娶了个潘金莲
- Word双栏和单栏的转换
- opencv立方体的画法_【不看后悔!】最详细的立方体透视变化及画法讲解
- MySQL是做什么的
- 微博、信息披露与分析师盈余预测
- unity制作一款塔防游戏
- fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏
热门文章
- Docker的上手(Ubuntu140.4 Mate)
- 后台cs代码控制html控件,在asp.net中*.aspx.cs肿么用后台代码编写前台的事件?
- TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体,
- 2021年想转行产品经理,应该如何入门?
- Git工作原理_繁星漫天_新浪博客
- python中文分词,生成标签云,生成指定形状图片标签云
- mac 平台显示歌词最好的音乐播放器软件 —— Vox + LyricsX
- 思源字体的安装和使用
- 锐捷交换机删除vlan
- STM32 HAL库之看门狗