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

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

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

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

运行效果图:

核心代码:

void AnimationButton::paintEvent(QPaintEvent *)

{

    if (image.isEmpty()) {

        return;

    }

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);

    QPixmap pix(image);

    pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);

    if (enter || leave) {

        int pixX = rect().center().x() - targetWidth / ;

        int pixY = rect().center().y() - targetHeight /  - ;

        QPoint point(pixX, pixY);

        painter.drawPixmap(point, pix);

        painter.drawText(QRectF(, height() - , width(), ), Qt::AlignCenter, text);

    }

}

完整代码:

animationbutton.h

#ifndef ANIMATIONBUTTON_H

#define ANIMATIONBUTTON_H

/**

 * 作者:feiyangqingyun(QQ:517216493) 2016-10-22

 * 1:可设置显示的图像和底部的文字

 */

#include <QWidget>

#include <QVariant>

class QPropertyAnimation;

class AnimationButton : public QWidget

{

    Q_OBJECT

public:

    explicit AnimationButton(QWidget *parent = );

    ~AnimationButton();

protected:

    void enterEvent(QEvent *);

    void leaveEvent(QEvent *);

    void paintEvent(QPaintEvent *);

private:

    bool enter;                         //是否进入

    bool leave;                         //是否离开

    int pixWidth;                       //图片宽度

    int pixHeight;                      //图片高度

    int oldWidth;                       //图片旧宽度

    int oldHeight;                      //图片旧高度

    QPropertyAnimation *enterAnimation; //进入动画

    QPropertyAnimation *leaveAnimation; //离开动画

    int targetWidth;                    //目标宽度

    int targetHeight;                   //目标高度

    QString text;                       //显示文字

    QString image;                      //图像路径

private slots:

    void enterImageChanged(QVariant index);

    void leaveImageChanged(QVariant index);

public slots:

    //设置显示的文字

    void setText(QString text);

    //设置显示的图像

    void setImage(QString image);

};

#endif // ANIMATIONBUTTON_H

animationbutton.cpp

#include "animationbutton.h"

#include "qpainter.h"

#include "qpropertyanimation.h"

#include "qdebug.h"

AnimationButton::AnimationButton(QWidget *parent) : QWidget(parent)

{

    enter = true;

    leave = false;

    pixWidth = ;

    pixHeight = ;

    oldWidth = ;

    oldHeight = ;

    enterAnimation = new QPropertyAnimation(this, "");

    enterAnimation->setStartValue();

    enterAnimation->setEndValue();

    enterAnimation->setDuration();

    connect(enterAnimation, SIGNAL(valueChanged(QVariant)), this, SLOT(enterImageChanged(QVariant)));

    leaveAnimation = new QPropertyAnimation(this, "");

    leaveAnimation->setStartValue();

    leaveAnimation->setEndValue();

    leaveAnimation->setDuration();

    connect(leaveAnimation, SIGNAL(valueChanged(QVariant)), this, SLOT(leaveImageChanged(QVariant)));

}

AnimationButton::~AnimationButton()

{

    delete enterAnimation;

    delete leaveAnimation;

}

void AnimationButton::enterEvent(QEvent *)

{

    enter = true;

    leave = false;

    pixWidth = pixWidth - ;

    pixHeight = pixHeight - ;

    enterAnimation->start();

}

void AnimationButton::leaveEvent(QEvent *)

{

    enter = false;

    leave = true;

    pixWidth = oldWidth;

    pixHeight = oldHeight;

    leaveAnimation->start();

}

void AnimationButton::paintEvent(QPaintEvent *)

{

    if (image.isEmpty()) {

        return;

    }

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);

    QPixmap pix(image);

    pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);

    if (enter || leave) {

        int pixX = rect().center().x() - targetWidth / ;

        int pixY = rect().center().y() - targetHeight /  - ;

        QPoint point(pixX, pixY);

        painter.drawPixmap(point, pix);

        painter.drawText(QRectF(, height() - , width(), ), Qt::AlignCenter, text);

    }

}

void AnimationButton::enterImageChanged(QVariant index)

{

    int i = index.toInt();

    targetWidth = pixWidth + i * ;

    targetHeight = pixHeight + i * ;

    update();

}

void AnimationButton::leaveImageChanged(QVariant index)

{

    int i = index.toInt();

    targetWidth = pixWidth - i * ;

    targetHeight = pixWidth - i * ;

    update();

}

void AnimationButton::setImage(QString image)

{

    this->image = image;

    QPixmap pix(image);

    pixWidth = pix.width();

    pixHeight = pix.height();

    oldWidth = pixWidth;

    oldHeight = pixHeight;

    targetWidth = pixWidth - ;

    targetHeight = pixHeight - ;

    update();

}

void AnimationButton::setText(QString text)

{

    this->text = text;

    update();

}

此自定义控件集成在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. 选择哪种方式进行SharePoint的备份

    关于SharePoint的备份还原功能,大家可能都有所了解.但是SharePoint一共有多少种备份方式呢,哪种备份方式是更适合你的呢,本文主要为大家梳理,并且深入的研究一下常见的几种备份方式,以便大 ...

  2. zookeeper 安装与配置

    (1) 下载ZooKeeper,建议选择稳定版,即stable的. [root@bonnie1 ~]# cd /usr/local [root@bonnie1 local]# wget http:// ...

  3. javaweb回顾第二篇tomcat和web程序部署

    前言这篇主要说下关于tomcat中一些属性和web程序的简单部署,可能在实际开发有更好的部署方式,但是这也是一个基础. 1:tomcat 关于tomcat估计只要接触java的人都听过这个名字,那我们 ...

  4. no sigar-amd64-winnt.dll in java.library.path 错误

    需要维护别人写的一个WEB项目,还原数据库,从SVN中检出源码,运行,提示如下错误: 5526 [localhost-startStop-1] DEBUG Sigar  - no sigar-amd6 ...

  5. Android MultiDex兼容包怎么使用?

    在Android系统中安装应用的时候,需要对Dex进行优化,但由于其处理工具DexOpt的限制,导致其id的数目不能够超过65536个.而MultiDex兼容包的出现,就很好的解决了这个问题,它可以配 ...

  6. SoapUI Pro Project Solution Collection-DataSource(jdbc,excel)

    here give a solution for excel file change the excel configuration these: Set Excel file path in cur ...

  7. 在Servlet中出现一个输出中文乱码的问题(已经解)。

    在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResp ...

  8. 使用 Express 和 waterline 创建简单 Restful API

    这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000004996659  突然想起来我这个博客冷落了好多年了,也该更新一下, ...

  9. Codeforces Beta Round #62 题解【ABCD】

    Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...

  10. 初探单点登录 SSO

    单点登录 单点登录(Single sign-on,SSO)是一种访问控制,在多个软件应用中,用户只需登录其中一个应用,就可以成功访问其他应用:同样,用户只需注销其中一个应用,就可以成功注销其他应用. ...