现在的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. javascript 函数详解2 -- arguments

    今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...

  2. atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源

    atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源 1. GMT(Greenwich Mean Time)是格林尼治平时 ...

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

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

  4. FreeMarker模板语法

    四.FreeMarker模板语法 要编写复杂的模板需要熟悉FreeMarker语法规则,官网有详细说明,中文帮助也比较详细了,下面这些内容是从网上收罗来的,感谢网友的分享,经过整理与修改的内容如下.建 ...

  5. bzoj 3517: 翻硬币

    3517: 翻硬币 Time Limit: 1 Sec  Memory Limit: 128 MB Description 有一个n行n列的棋盘,每个格子上都有一个硬币,且n为偶数.每个硬币要么是正面 ...

  6. FPGA4U FPGA SDRAM Controller

    -- https://fpga4u.epfl.ch/wiki/FPGA4U_Description -- The SDRAM bits data ..> signals, -- one ..&g ...

  7. 简述Java内存模型的由来、概念及语义

    JDK5引入了JMM新规范:JSR-133,引入了happens-before/可见性等概念,对synchronized/volatile/final等关键词进行了语义定义.解决了:final变量在构 ...

  8. iOS crash 异常捕获

    // //  UncaughtExceptionHandler.m //  UncaughtExceptions // //  Created by Matt Gallagher on 2010/05 ...

  9. mssql 获取表空间大小

    create table #Data(name varchar(100),row varchar(100),reserved varchar(100),data varchar(100),index_ ...

  10. 【转载】酷酷的CSS3三角形运用

    转载:http://www.cnblogs.com/keepfool/p/5616326.html 概述 在早期的前端Web设计开发年代,完成一些页面元素时,我们必须要有专业的PS美工爸爸,由PS美工 ...