现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原。

Qt编写自定义控件还是非常方便和非常强大的,数量掌握Qpainter的各种绘制,自定义任意控件几乎都不是难题,只有想不到,没有做不到。

贴一张个人认为做的比较炫的UI界面:

如果工控项目的界面能够做到这种程序,应该可以让人眼前一亮。

运行效果图:

核心代码:

  1. void AnimationButton::paintEvent(QPaintEvent *)
  2.  
  3. {
  4.  
  5. if (image.isEmpty()) {
  6.  
  7. return;
  8.  
  9. }
  10.  
  11. QPainter painter(this);
  12.  
  13. painter.setRenderHint(QPainter::Antialiasing);
  14.  
  15. QPixmap pix(image);
  16.  
  17. pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  18.  
  19. if (enter || leave) {
  20.  
  21. int pixX = rect().center().x() - targetWidth / ;
  22.  
  23. int pixY = rect().center().y() - targetHeight / - ;
  24.  
  25. QPoint point(pixX, pixY);
  26.  
  27. painter.drawPixmap(point, pix);
  28.  
  29. painter.drawText(QRectF(, height() - , width(), ), Qt::AlignCenter, text);
  30.  
  31. }
  32.  
  33. }

完整代码:

animationbutton.h

  1. #ifndef ANIMATIONBUTTON_H
  2.  
  3. #define ANIMATIONBUTTON_H
  4.  
  5. /**
  6.  
  7. * 作者:feiyangqingyun(QQ:517216493) 2016-10-22
  8.  
  9. * 1:可设置显示的图像和底部的文字
  10.  
  11. */
  12.  
  13. #include <QWidget>
  14.  
  15. #include <QVariant>
  16.  
  17. class QPropertyAnimation;
  18.  
  19. class AnimationButton : public QWidget
  20.  
  21. {
  22.  
  23. Q_OBJECT
  24.  
  25. public:
  26.  
  27. explicit AnimationButton(QWidget *parent = );
  28.  
  29. ~AnimationButton();
  30.  
  31. protected:
  32.  
  33. void enterEvent(QEvent *);
  34.  
  35. void leaveEvent(QEvent *);
  36.  
  37. void paintEvent(QPaintEvent *);
  38.  
  39. private:
  40.  
  41. bool enter; //是否进入
  42.  
  43. bool leave; //是否离开
  44.  
  45. int pixWidth; //图片宽度
  46.  
  47. int pixHeight; //图片高度
  48.  
  49. int oldWidth; //图片旧宽度
  50.  
  51. int oldHeight; //图片旧高度
  52.  
  53. QPropertyAnimation *enterAnimation; //进入动画
  54.  
  55. QPropertyAnimation *leaveAnimation; //离开动画
  56.  
  57. int targetWidth; //目标宽度
  58.  
  59. int targetHeight; //目标高度
  60.  
  61. QString text; //显示文字
  62.  
  63. QString image; //图像路径
  64.  
  65. private slots:
  66.  
  67. void enterImageChanged(QVariant index);
  68.  
  69. void leaveImageChanged(QVariant index);
  70.  
  71. public slots:
  72.  
  73. //设置显示的文字
  74.  
  75. void setText(QString text);
  76.  
  77. //设置显示的图像
  78.  
  79. void setImage(QString image);
  80.  
  81. };
  82.  
  83. #endif // ANIMATIONBUTTON_H

animationbutton.cpp

  1. #include "animationbutton.h"
  2.  
  3. #include "qpainter.h"
  4.  
  5. #include "qpropertyanimation.h"
  6.  
  7. #include "qdebug.h"
  8.  
  9. AnimationButton::AnimationButton(QWidget *parent) : QWidget(parent)
  10.  
  11. {
  12.  
  13. enter = true;
  14.  
  15. leave = false;
  16.  
  17. pixWidth = ;
  18.  
  19. pixHeight = ;
  20.  
  21. oldWidth = ;
  22.  
  23. oldHeight = ;
  24.  
  25. enterAnimation = new QPropertyAnimation(this, "");
  26.  
  27. enterAnimation->setStartValue();
  28.  
  29. enterAnimation->setEndValue();
  30.  
  31. enterAnimation->setDuration();
  32.  
  33. connect(enterAnimation, SIGNAL(valueChanged(QVariant)), this, SLOT(enterImageChanged(QVariant)));
  34.  
  35. leaveAnimation = new QPropertyAnimation(this, "");
  36.  
  37. leaveAnimation->setStartValue();
  38.  
  39. leaveAnimation->setEndValue();
  40.  
  41. leaveAnimation->setDuration();
  42.  
  43. connect(leaveAnimation, SIGNAL(valueChanged(QVariant)), this, SLOT(leaveImageChanged(QVariant)));
  44.  
  45. }
  46.  
  47. AnimationButton::~AnimationButton()
  48.  
  49. {
  50.  
  51. delete enterAnimation;
  52.  
  53. delete leaveAnimation;
  54.  
  55. }
  56.  
  57. void AnimationButton::enterEvent(QEvent *)
  58.  
  59. {
  60.  
  61. enter = true;
  62.  
  63. leave = false;
  64.  
  65. pixWidth = pixWidth - ;
  66.  
  67. pixHeight = pixHeight - ;
  68.  
  69. enterAnimation->start();
  70.  
  71. }
  72.  
  73. void AnimationButton::leaveEvent(QEvent *)
  74.  
  75. {
  76.  
  77. enter = false;
  78.  
  79. leave = true;
  80.  
  81. pixWidth = oldWidth;
  82.  
  83. pixHeight = oldHeight;
  84.  
  85. leaveAnimation->start();
  86.  
  87. }
  88.  
  89. void AnimationButton::paintEvent(QPaintEvent *)
  90.  
  91. {
  92.  
  93. if (image.isEmpty()) {
  94.  
  95. return;
  96.  
  97. }
  98.  
  99. QPainter painter(this);
  100.  
  101. painter.setRenderHint(QPainter::Antialiasing);
  102.  
  103. QPixmap pix(image);
  104.  
  105. pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  106.  
  107. if (enter || leave) {
  108.  
  109. int pixX = rect().center().x() - targetWidth / ;
  110.  
  111. int pixY = rect().center().y() - targetHeight / - ;
  112.  
  113. QPoint point(pixX, pixY);
  114.  
  115. painter.drawPixmap(point, pix);
  116.  
  117. painter.drawText(QRectF(, height() - , width(), ), Qt::AlignCenter, text);
  118.  
  119. }
  120.  
  121. }
  122.  
  123. void AnimationButton::enterImageChanged(QVariant index)
  124.  
  125. {
  126.  
  127. int i = index.toInt();
  128.  
  129. targetWidth = pixWidth + i * ;
  130.  
  131. targetHeight = pixHeight + i * ;
  132.  
  133. update();
  134.  
  135. }
  136.  
  137. void AnimationButton::leaveImageChanged(QVariant index)
  138.  
  139. {
  140.  
  141. int i = index.toInt();
  142.  
  143. targetWidth = pixWidth - i * ;
  144.  
  145. targetHeight = pixWidth - i * ;
  146.  
  147. update();
  148.  
  149. }
  150.  
  151. void AnimationButton::setImage(QString image)
  152.  
  153. {
  154.  
  155. this->image = image;
  156.  
  157. QPixmap pix(image);
  158.  
  159. pixWidth = pix.width();
  160.  
  161. pixHeight = pix.height();
  162.  
  163. oldWidth = pixWidth;
  164.  
  165. oldHeight = pixHeight;
  166.  
  167. targetWidth = pixWidth - ;
  168.  
  169. targetHeight = pixHeight - ;
  170.  
  171. update();
  172.  
  173. }
  174.  
  175. void AnimationButton::setText(QString text)
  176.  
  177. {
  178.  
  179. this->text = text;
  180.  
  181. update();
  182.  
  183. }

此自定义控件集成在QFramework中。

自定义控件可执行文件下载:http://pan.baidu.com/s/1i5iCfzv

QFramework简介:

QFramework是一套通用的Qt程序开发框架,集成主界面布局、各种自定义控件、数据库处理、excel极速导出、数据打印、串口通信、网络通信、协议解析、全局热键、邮件发送,短信发送,百度地图调用、ffmpeg+vlc处理等功能,将常用的功能封装成类库,提供统一直观的调用接口,方便使用者使用,对应封装的库都有对应的demo程序。

QFramework基本功能:

1:支持从4.7.0到5.7.0的任何Qt版本,不受版本限制。用了此框架,不会再有Qt版本不同而引起的程序编译通不过的烦恼。

2:极速导出数据到excel,支持表格数据或者查询的数据,不依赖任何组件,支持任何excel、wps等表格软件版本,导出10万行数据8个字段只需要3秒完成。对导出的表格样式可自定义主标题和副标题,可对导出的数据按照指定条件红色突出显示。

3:数据导出到pdf及打印功能,支持表格数据或者查询的数据,支持横向纵向打印,自动分页。

4:数据分页dbapi类,只需传入表格对象,表名,翻页按钮即可。无需再写重复的方法处理翻页。

5:各种自定义控件,例如开关按钮、发光按钮,仪表盘控件、音量控件、温湿度控件、仪表仪器类控件等。

6:全新超级中英双拼输入法,非常适合触摸设备。

7:全局热键处理。

8:串口热敏打印机打印。

9:qcustomplot 2D图形曲线绘制(含鼠标数据跟踪)。

10:多线程邮件发送,支持多个接收邮箱。

11:多线程短信发送,支持多个接收号码及长短信。

12:Qffmpeg+Qvlc视频处理。

13:取字模,字符转LED数据处理。

14:全局日志输出类 applog,可动态挂载和卸载。

15:全局程序控制类 appkey,可控制程序的使用时间、运行时间、设备数量限制等。

16:封装百度地图调用接口,支持设备标注、路线查询、位置显示等。

17:自动清理程序早期数据类 cleanapi,传入要清理的数据库表名,执行间隔,保留的最大记录数即可。这样保证了整个系统存储的都是最新的数据。

18:NTP校时服务程序。

19:全局截图处理,可以很方便的直接在ARM上对程序进行截图。

20:程序存活检测功能 applive,通过udp通信实时发送心跳命令,这样可以保证程序7*24小时运行,在ARM上可采用 appdog看门狗程序。

21:已运行时间+当前时间+实时CPU使用率+实时内存使用率等。

22:自定义程序主界面底部信息。

23:Echart图表的交互使用。

Qt编写自定义控件二动画按钮的更多相关文章

  1. Qt编写自定义控件42-开关按钮

    一.前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ.360卫士.金山毒霸等,都有很多开关控制一些操作,在Qt ...

  2. Qt编写自定义控件9-导航按钮控件

    前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2 ...

  3. Qt编写自定义控件8-动画按钮组控件

    前言 动画按钮组控件可以用来当做各种漂亮的导航条用,既可以设置成顶部底部+左侧右侧,还自带精美的滑动效果,还可以设置悬停滑动等各种颜色,原创作者雨田哥(QQ:3246214072),驰骋Qt控件界多年 ...

  4. Qt编写自定义控件38-高亮按钮

    一.前言 高亮按钮控件,既可以作为类似于交通指示灯使用,也可以作为设备状态指示灯使用,控件内置多套颜色风格,还可以自己设置颜色风格,按钮可以增加文字显示,非常适合需要在状态设备上显示小量的文字展示,按 ...

  5. Qt编写自定义控件37-发光按钮(会呼吸的痛)

    一.前言 这个控件是好早以前写的,已经授权过好几个人开源过此控件代码,比如红磨坊小胖,此控件并不是来源于真实需求,而仅仅是突发奇想,类似于星星的闪烁,越到边缘越来越淡,定时器动态改变边缘发光的亮度,产 ...

  6. Qt编写自定义控件27-颜色按钮面板

    一.前言 颜色按钮面板主要用在提供一个颜色按钮面板,用户单击某个按钮,然后拿到对应的颜色值,用户可以预先设定常用的颜色集合,传入到控件中,自动生成面板颜色集合按钮,每当滑过按钮的时候,按钮边缘高亮提示 ...

  7. Qt编写自定义控件33-图片切换动画

    一.前言 在很多看图软件中,切换图片的时候可以带上动画过渡或者切换效果,显得更人性化,其实主要还是炫一些,比如百叶窗.透明度变化.左下角飞入等,无论多少种效果,核心都是围绕QPainter来进行,将各 ...

  8. Qt编写自定义控件30-颜色多态按钮

    一.前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得 ...

  9. Qt编写自定义控件11-设备防区按钮控件

    前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指 ...

随机推荐

  1. Sale.js——快速创建促销样式

    小菜编写的又一款jQuery小插件,有兴趣的朋友可以试试~ 简介: 对于一个用于产品展示.销售的网站而言,很可能需要一种促销的特效. 一般而言,我们会在商品图片前加一个促销栏,写上一些促销标语.原价. ...

  2. linux tar order

    http://blog.csdn.net/imyang2007/article/details/7634470 把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案-x:解压-t:查 ...

  3. HTML5 ——本地存储

    目录 一.HTML4客户端存储 1.1.提交表单发送到服务器的信息 1.2.客户端本地存储概要 二.localStorage 2.1.添加 2.2.取值 2.3.修改 2.4.删除 2.5.跨页面与跨 ...

  4. Javascript中prototype属性的详解

    原文链接:http://www.cnblogs.com/Uncle-Keith/p/5834289.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象 ...

  5. Atitit. 构造ast 语法树的总结attilax v2 q0f

    Atitit. 构造ast 语法树的总结attilax v2 q0f 1. Ast结构树形1 2. ast view (自是个160k的jar )2 2.1. 多条语句ast结构2 2.2. 变量定义 ...

  6. 生成月初月末便于拼接sql

    for ($i=1; $i < 13; $i++) { $date = strtotime(date("2015-$i-01")); $firstday = date(&qu ...

  7. git 日志格式化

    alias.lg=log --graph --pretty=format:'%Cred%H%Creset @%C(yellow)%d%Creset %n Author: %cn <%ce> ...

  8. Clojure上手

    Clojure,这是什么鬼?一门基于JVM(现在也有基于.NET CLR的了:Clojure CLR) 的函数式编程语言.在JVM平台运行的时候,会被编译为JVM的字节码进行运算..为什么要学它?其设 ...

  9. 在VisualStudio中应该使用什么字体

    转自:http://blog.csdn.net/bclz_vs/article/details/6607695 字体通常分为几个主要类型 San-Serif:无衬线字体 Serif:有衬线的字体 Mo ...

  10. mac os x安装ngigx+php fastcgi+mysql+memcache详细流程

    Part 1: MacPorts Mac上装软件常用的是MacPorts和homebrew,这个软件会很方便地提供软件的安装.装这些前先得装Xcode,Xcode在appstore上有,一个多G,下载 ...