如何用Qt打造按钮?
摘要:背景: 想着自己实现一个好看一点的按钮,切换时加一点动画。也算巩固一下Qt的基本知识。 基本环境: 主要用到的类有: QBrush:画刷,主要是画一些颜色啥的。 QPainter:画笔,可以画形状。比如带弧形的矩形,圆形,写字等。 QPro
背景:
想着自己实现一个好看一点的按钮,切换时加一点动画。也算巩固一下Qt的基本知识。
基本环境:
主要用到的类有:
QBrush:画刷,主要是画一些颜色啥的。
QPainter:画笔,可以画形状。比如带弧形的矩形,圆形,写字等。
QPropertyAnimation:动画相关。
关键逻辑:
重载paintEvent:实现渲染逻辑,在这里根据不同的状态画出不同的颜色。
重载mousePressEvent:鼠标点击时切换状态。
将QPropertyAnimation::valueChanged信号函数连接起来,获取动画运行时的值,然后重新绘制圆形。
上代码:
一些逻辑和类的用法见注释。
mybutton.h:
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QWidget>
#include <QPropertyAnimation>
class MyButton : public QWidget
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = nullptr);
bool GetIsOff(){return isoff;}; // 提供一个对外接口
signals:
void isClicked();
void notifyStatus(bool bOff); // 发一个带参数的信号
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override; // 鼠标点击事件
void resizeEvent(QResizeEvent* event) override; // 窗口大小发生改变的事件
private:
bool isoff = true; // 根据状态去选择不同的颜色
QBrush offBgBrush = Qt::black;
QBrush offRBrush = Qt::red;
QBrush onBgBrush = Qt::gray;
QBrush onRBrush = Qt::green;
QString offText = "OFF";
QString onText = "ON";
QPropertyAnimation *animation; // 动画相关
int currentX = height()/2; // 圆形当前的位置
};
#endif // MYBUTTON_H
mybutton.cpp:
#include "mybutton.h"
#include <QMouseEvent>
#include <QPainter>
MyButton::MyButton(QWidget *parent)
: QWidget{parent}
{
setFixedSize(60,30);
animation = new QPropertyAnimation(this);
animation->setTargetObject(this);
animation->setStartValue(height()/2);
animation->setEndValue(width() - height()/2);
animation->setEasingCurve(QEasingCurve::InOutCirc); // 设置移动的曲线。比如可以先慢后快。这里是设置回弹效果。
animation->setDuration(500); // 移动的持续时间
// 这里用了一个匿名函数
connect(animation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value){
currentX = value.toInt(); // 动画产生的时候更新当前位置
update();
});
}
void MyButton::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event); // 不使用event时,为了编译时不加告警,用一个宏控制。
