• 10974阅读
  • 15回复

Qt编写自定义控件二动画按钮 [复制链接]

上一主题 下一主题
在线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2016-11-07
    现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原。
    Qt编写自定义控件还是非常方便和非常强大的,数量掌握Qpainter的各种绘制,自定义任意控件几乎都不是难题,只有想不到,没有做不到。
贴一张个人认为做的比较炫的UI界面:


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

运行效果图:



核心代码:
  1. void AnimationButton::paintEvent(QPaintEvent *)
  2. {
  3.     if (image.isEmpty()) {
  4.         return;
  5.     }
  6.     QPainter painter(this);
  7.     painter.setRenderHint(QPainter::Antialiasing);
  8.     QPixmap pix(image);
  9.     pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  10.     if (enter || leave) {
  11.         int pixX = rect().center().x() - targetWidth / 2;
  12.         int pixY = rect().center().y() - targetHeight / 2 - 10;
  13.         QPoint point(pixX, pixY);
  14.         painter.drawPixmap(point, pix);
  15.         painter.drawText(QRectF(0, height() - 20, width(), 20), Qt::AlignCenter, text);
  16.     }
  17. }




完整代码:
animationbutton.h
  1. #ifndef ANIMATIONBUTTON_H
  2. #define ANIMATIONBUTTON_H
  3. /**
  4. * 作者:feiyangqingyun(QQ:517216493) 2016-10-22
  5. * 1:可设置显示的图像和底部的文字
  6. */
  7. #include <QWidget>
  8. #include <QVariant>
  9. class QPropertyAnimation;
  10. class AnimationButton : public QWidget
  11. {
  12.     Q_OBJECT
  13. public:
  14.     explicit AnimationButton(QWidget *parent = 0);
  15.     ~AnimationButton();
  16. protected:
  17.     void enterEvent(QEvent *);
  18.     void leaveEvent(QEvent *);
  19.     void paintEvent(QPaintEvent *);
  20. private:
  21.     bool enter;                         //是否进入
  22.     bool leave;                         //是否离开
  23.     int pixWidth;                       //图片宽度
  24.     int pixHeight;                      //图片高度
  25.     int oldWidth;                       //图片旧宽度
  26.     int oldHeight;                      //图片旧高度
  27.     QPropertyAnimation *enterAnimation; //进入动画
  28.     QPropertyAnimation *leaveAnimation; //离开动画
  29.     int targetWidth;                    //目标宽度
  30.     int targetHeight;                   //目标高度
  31.     QString text;                       //显示文字
  32.     QString image;                      //图像路径
  33. private slots:
  34.     void enterImageChanged(QVariant index);
  35.     void leaveImageChanged(QVariant index);
  36. public slots:
  37.     //设置显示的文字
  38.     void setText(QString text);
  39.     //设置显示的图像
  40.     void setImage(QString image);
  41. };
  42. #endif // ANIMATIONBUTTON_H

animationbutton.cpp
  1. #include "animationbutton.h"
  2. #include "qpainter.h"
  3. #include "qpropertyanimation.h"
  4. #include "qdebug.h"
  5. AnimationButton::AnimationButton(QWidget *parent) : QWidget(parent)
  6. {
  7.     enter = true;
  8.     leave = false;
  9.     pixWidth = 0;
  10.     pixHeight = 0;
  11.     oldWidth = 0;
  12.     oldHeight = 0;
  13.     enterAnimation = new QPropertyAnimation(this, "");
  14.     enterAnimation->setStartValue(0);
  15.     enterAnimation->setEndValue(5);
  16.     enterAnimation->setDuration(200);
  17.     connect(enterAnimation, SIGNAL(valueChanged(QVariant)), this, SLOT(enterImageChanged(QVariant)));
  18.     leaveAnimation = new QPropertyAnimation(this, "");
  19.     leaveAnimation->setStartValue(0);
  20.     leaveAnimation->setEndValue(5);
  21.     leaveAnimation->setDuration(200);
  22.     connect(leaveAnimation, SIGNAL(valueChanged(QVariant)), this, SLOT(leaveImageChanged(QVariant)));
  23. }
  24. AnimationButton::~AnimationButton()
  25. {
  26.     delete enterAnimation;
  27.     delete leaveAnimation;
  28. }
  29. void AnimationButton::enterEvent(QEvent *)
  30. {
  31.     enter = true;
  32.     leave = false;
  33.     pixWidth = pixWidth - 25;
  34.     pixHeight = pixHeight - 25;
  35.     enterAnimation->start();
  36. }
  37. void AnimationButton::leaveEvent(QEvent *)
  38. {
  39.     enter = false;
  40.     leave = true;
  41.     pixWidth = oldWidth;
  42.     pixHeight = oldHeight;
  43.     leaveAnimation->start();
  44. }
  45. void AnimationButton::paintEvent(QPaintEvent *)
  46. {
  47.     if (image.isEmpty()) {
  48.         return;
  49.     }
  50.     QPainter painter(this);
  51.     painter.setRenderHint(QPainter::Antialiasing);
  52.     QPixmap pix(image);
  53.     pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  54.     if (enter || leave) {
  55.         int pixX = rect().center().x() - targetWidth / 2;
  56.         int pixY = rect().center().y() - targetHeight / 2 - 10;
  57.         QPoint point(pixX, pixY);
  58.         painter.drawPixmap(point, pix);
  59.         painter.drawText(QRectF(0, height() - 20, width(), 20), Qt::AlignCenter, text);
  60.     }
  61. }
  62. void AnimationButton::enterImageChanged(QVariant index)
  63. {
  64.     int i = index.toInt();
  65.     targetWidth = pixWidth + i * 5;
  66.     targetHeight = pixHeight + i * 5;
  67.     update();
  68. }
  69. void AnimationButton::leaveImageChanged(QVariant index)
  70. {
  71.     int i = index.toInt();
  72.     targetWidth = pixWidth - i * 5;
  73.     targetHeight = pixWidth - i * 5;
  74.     update();
  75. }
  76. void AnimationButton::setImage(QString image)
  77. {
  78.     this->image = image;
  79.     QPixmap pix(image);
  80.     pixWidth = pix.width();
  81.     pixHeight = pix.height();
  82.     oldWidth = pixWidth;
  83.     oldHeight = pixHeight;
  84.     targetWidth = pixWidth - 25;
  85.     targetHeight = pixHeight - 25;
  86.     update();
  87. }
  88. void AnimationButton::setText(QString text)
  89. {
  90.     this->text = text;
  91.     update();
  92. }
此自定义控件集成在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实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线圣域天子

只看该作者 1楼 发表于: 2016-11-07
我以为第一张图是已经做出来的控件 。。。
在线liudianwu

只看该作者 2楼 发表于: 2016-11-07
回 圣域天子 的帖子
圣域天子:
我以为第一张图是已经做出来的控件 。。。

应该毫无压力,近期疯狂搞自定义控件,接下来有空会用qt实现那个界面上的控件。

欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线wzwdwjj

只看该作者 3楼 发表于: 2016-11-08
一直想学习Qt自定义控件,但是系统教程比较少

楼主可以写一个专题博客,系统的讲解一下
离线clickto

只看该作者 4楼 发表于: 2016-11-08
感觉做界面关键还是在美工啊!!!
离线boylebao

只看该作者 5楼 发表于: 2016-11-08
为Qt打造具有强大生产力的软件。
离线lsyzsl

只看该作者 6楼 发表于: 2016-11-08
刘大师是如何把那些控件打包到一个exe而不依赖qt其它的库
离线shasidaran

只看该作者 7楼 发表于: 2016-11-09
回 lsyzsl 的帖子
lsyzsl:刘大师是如何把那些控件打包到一个exe而不依赖qt其它的库 (2016-11-08 15:05) 

有专门的打包软件,将exe和dll封装成一个exe
离线lsyzsl

只看该作者 8楼 发表于: 2016-11-10
回 shasidaran 的帖子
shasidaran:有专门的打包软件,将exe和dll封装成一个exe (2016-11-09 19:09) 

能推荐下不?
离线shasidaran

只看该作者 9楼 发表于: 2016-11-10
回 lsyzsl 的帖子
lsyzsl:能推荐下不? (2016-11-10 09:56) 

你搜Molebox
离线spygg

只看该作者 10楼 发表于: 2016-11-10
第一张图是Qt widget做的吗?太炫酷了
签名就是这么浪
离线ktl123

只看该作者 11楼 发表于: 2016-11-15
源码没有啊
离线hejiang177

只看该作者 12楼 发表于: 2016-11-17
刘大 你历害了
老是要密码
离线moonlqer

只看该作者 13楼 发表于: 2016-11-20
请教,字符转LED显示的思路是什么?完全用QPainter绘制么?
学习Qt,分享有趣的想法,帮助所有人
离线霜叶红林

只看该作者 14楼 发表于: 2016-11-28
  
离线chenyan

只看该作者 15楼 发表于: 2017-12-26
    
快速回复
限100 字节
 
上一个 下一个