QT编写动态按钮程序

#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值