QTanimationbutton

#ifndef ANIMATIONBUTTON_H

#define ANIMATIONBUTTON_H

#include <QWidget>

#include <QVariant>

class QPropertyAnimation;

class AnimationButton : public QWidget

{

Q_OBJECT

public:

explicit AnimationButton(QWidget *parent = nullptr);

~AnimationButton();

protected:

void enterEvent(QEvent *event);

void leaveEvent(QEvent *event);

void paintEvent(QPaintEvent *event);

private:

bool enter;

bool leave;

int pixwidth;

int pixheight;

int oldwidth;

int oldheight;

int targetwidth;

int targetheight;

QString text;

QString image;

QPropertyAnimation *enteranimation;

QPropertyAnimation *leaveanimation;

private slots:

void enterimagechanged(QVariant index);

void leaveimagechanged(QVariant index);

public slots:

void settext(QString text);

void setimage(QString image);

signals:

};

#endif // ANIMATIONBUTTON_H


#include "animationbutton.h"

#include "qpainter.h"

#include "qdebug.h"

#include "qpropertyanimation.h"

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

{

enter=true;

leave=false;

pixwidth=0;

pixheight=0;

oldwidth=0;

oldheight=0;

enteranimation = new QPropertyAnimation(this,"");

enteranimation->setStartValue(0);

enteranimation->setEndValue(5);

enteranimation->setDuration(200);

connect(enteranimation,&QPropertyAnimation::valueChanged,this,&AnimationButton::enterimagechanged);

leaveanimation = new QPropertyAnimation(this,"");

leaveanimation->setStartValue(0);

leaveanimation->setEndValue(5);

leaveanimation->setDuration(200);

connect(leaveanimation,&QPropertyAnimation::valueChanged,this,&AnimationButton::leaveimagechanged);

}

AnimationButton::~AnimationButton()

{

delete enteranimation;

delete leaveanimation;

}

void AnimationButton::enterEvent(QEvent *event)

{

enter=true;

leave=false;

pixwidth=pixwidth-25;

pixheight=pixheight-25;

enteranimation->start();

}

void AnimationButton::leaveEvent(QEvent *event)

{

enter=false;

leave=true;

pixwidth=oldwidth;

pixheight=oldheight;

leaveanimation->start();

}

void AnimationButton::paintEvent(QPaintEvent *event)

{

if (image.isEmpty())

{

return;

}

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing);

QPixmap pix(image);

pix=pix.scaled(targetwidth,targetheight,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);

if(enter || leave)

{

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

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

QPoint point(pixX,pixY);

painter.drawPixmap(point,pix);

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

}

}

void AnimationButton::enterimagechanged(QVariant index)

{

int i=index.toInt();

targetwidth=pixwidth+i*5;

targetheight=pixheight+i*5;

update();

}

void AnimationButton::leaveimagechanged(QVariant index)

{

int i=index.toInt();

targetwidth=pixwidth-i*5;

targetheight=pixheight-i*5;

update();

}

void AnimationButton::settext(QString text)

{

this->text=text;

update();

}

void AnimationButton::setimage(QString image)

{

this->image=image;

QPixmap pix(image);

pixwidth=pix.width();

pixheight=pix.height();

oldwidth=pixwidth;

oldheight=pixheight;

targetwidth=pixwidth-25;

targetheight=pixheight-25;

update();

}


#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE

namespace Ui { class Widget; }

QT_END_NAMESPACE

class Widget : public QWidget

{

Q_OBJECT

public:

Widget(QWidget *parent = nullptr);

~Widget();

private:

Ui::Widget *ui;

};

#endif // WIDGET_H


#include "widget.h"

#include "ui_widget.h"

Widget::Widget(QWidget *parent)

: QWidget(parent)

, ui(new Ui::Widget)

{

ui->setupUi(this);

// QString qss="color:#BECEC6;background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #FFFFFF,stop:1 #EAF2FF)";

// QString qss="color:#BECEC6;background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 #030303,stop:1 #2E8B57)";

// QString qss="color:black;background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 green,stop:1 blue)";

QString qss="color:rgba(0,0,0,1);background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 rgba(0, 255, 0, 255),stop:1 rgba(255, 255, 0, 255))";

this->setStyleSheet(qss);

ui->widget1->settext("inter");

ui->widget1->setimage(":/new/prefix1/image/inter.png");

ui->widget2->settext("other");

ui->widget2->setimage(":/new/prefix1/image/other.png");

ui->widget3->settext("user");

ui->widget3->setimage(":/new/prefix1/image/user.png");

ui->widget4->settext("set");

ui->widget4->setimage(":/new/prefix1/image/set.png");

ui->widget4->update();

}

Widget::~Widget()

{

delete ui;

}

相关推荐
奇树谦2 天前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
BroNekoX3 天前
我将基于 QtQuick 框架开发的音乐播放器性能做到顶级
qt
小小晓.3 天前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
扶尔魔ocy4 天前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
lhbweilai4 天前
QT项目(串口助手)
开发语言·qt
小鱼仙官5 天前
Qt 主界面弹出分界面
开发语言·qt
誰能久伴不乏5 天前
用 UDP 做一条“可靠“的控制通道
c++·qt·网络协议·udp
Bczheng15 天前
VS2022 安装MFC和QT
c++·qt·mfc
会编程的小孩6 天前
8.19号函数
qt
蓝祁子yoky6 天前
Qt学习日记 Day15:网络编程(二)- UDP基础
网络·qt·学习