QT开发之旋转按钮(一)

第一步画定点三角形

第二步画背景大圆

第三步画背小圆

第四步画旋转的棍子

第五步画刻度

加了抗锯齿比原来的好看些

1、使用方法:动态创建

MySpinButton Spin_button = new MySpinButton(this);
Spin_button->resize (200, 200);
Spin_button->move (350, 200);
Spin_button->show();

2、MySpinButton.h

#ifndef MYSPINBUTTON_H
#define MYSPINBUTTON_H

#include <QWidget>

#define whirlbuttonHeigth   130
#define whirlbuttonWidth    120

class MySpinButton : public QWidget
{
    Q_OBJECT
public:
    void  paintEvent(QPaintEvent *event);
    explicit MySpinButton(QWidget *parent = nullptr);
    ~MySpinButton();
    void setDegree(int deg);
    int getDegree();

signals:
    void updateDegree();
protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseToPosion(QMouseEvent *event);
    QSize sizeHint() const;
    QSize minimumSizeHint() const;
private:
    int degree;
};

#endif // MYSPINBUTTON_H

3、MySpinButton.cpp

#include "myspinbutton.h"
#include <QPainter>
#include <QMouseEvent>
#include <math.h>

MySpinButton::MySpinButton(QWidget *parent) : QWidget(parent)
{
    setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
    degree = 90;
}

MySpinButton::~MySpinButton()
{
}

void MySpinButton::setDegree(int deg)
{
    this->degree = deg;
    this->update();
}
void MySpinButton::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    //反走样
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    QTransform tranform1;
    int originY = whirlbuttonHeigth/2;
    int originX = whirlbuttonWidth/2;


    const int triangle[3][2] =
    {
        { originX-2, 0 },
        { originX+2, 0 },
        { originX, 7 }
    };

    painter.setPen(QPen(Qt::red));
    painter.setBrush(QBrush(Qt::red));
    //绘制多边形,三角形。
    painter.drawPolygon(QPolygon(3, &triangle[0][0]));


    tranform1.translate(originX,originY);
    tranform1.rotate(degree);
    tranform1.translate(-(originX),-(originY));
    painter.setWorldTransform(tranform1);

    QPen thickPen(palette().foreground(), 1.5);
    QPen midPen(palette().foreground(), 1.0);
    QPen thinPen(palette().foreground(), 0.5);
    QColor niceBlue(150, 150, 200);
    painter.setPen(thinPen);


    //随着程度逐渐改变
    QConicalGradient coneGradient(originX, originY, -90.0);
    coneGradient.setColorAt(0.0, Qt::darkGray);
    coneGradient.setColorAt(0.2, niceBlue);
    coneGradient.setColorAt(1.0, Qt::white);
    coneGradient.setColorAt(1.0, Qt::darkGray);

    unsigned r = 56;
    painter.setBrush(coneGradient);
    painter.drawEllipse((originX-r), (originY-r), r*2, r*2);

    r = 24;
    QRadialGradient haloGradient(originX, originY, r, originX, originY);
    haloGradient.setColorAt(0.0, Qt::lightGray);
    haloGradient.setColorAt(0.8, Qt::darkGray);
    haloGradient.setColorAt(0.9, Qt::white);
    haloGradient.setColorAt(1.0, Qt::black);

    painter.setPen(Qt::NoPen);
    painter.setBrush(haloGradient);

    painter.drawEllipse(originX-r, originY-r, r*2, 2*r);

    unsigned rx = 30,ry = 8;
    QLinearGradient knobGradient(originX-rx, originY-ry,originX-rx, originY+ry);
    knobGradient.setColorAt(0.0, Qt::black);
    knobGradient.setColorAt(0.2, niceBlue);
    knobGradient.setColorAt(0.3, Qt::lightGray);
    knobGradient.setColorAt(0.8, Qt::white);
    knobGradient.setColorAt(1.0, Qt::black);

    painter.setBrush(knobGradient);
    painter.setPen(thinPen);
    painter.drawRoundRect(originX-rx,originY-ry, rx*2, ry*2, 49, 99);


    for (int i = 0; i < 36; ++i)
    {
        if (i%6)
        {
            painter.setPen(midPen);
            painter.drawLine(5,originY, 10,originY);
        }
        else
        {
            painter.setPen(thickPen);
            painter.drawLine(5,originY, 13,originY);

            tranform1.translate(25,originY);
            tranform1.rotate(-90);
            tranform1.translate(-25,-originY);
            painter.setWorldTransform(tranform1);

            painter.drawText(22, originY,QString::number(i/6));
            tranform1.translate(25,originY);
            tranform1.rotate(90);
            tranform1.translate(-25,-originY);
            painter.setWorldTransform(tranform1);

        }

        tranform1.translate(originX,originY);
        tranform1.rotate(-10);
        tranform1.translate(-originX,-originY);
        painter.setWorldTransform(tranform1);
    }
}
QSize MySpinButton::sizeHint() const
{
    QSize size = QSize(whirlbuttonHeigth,whirlbuttonWidth);
    return size;
}
QSize MySpinButton::minimumSizeHint() const
{
    QSize size = QSize(whirlbuttonHeigth,whirlbuttonWidth);
    return size;
}
void MySpinButton::mousePressEvent(QMouseEvent *event)
{
    mouseToPosion(event);
    this->update();
}
int MySpinButton :: getDegree()
{
    return(degree);
}
void MySpinButton::mouseMoveEvent(QMouseEvent * event)
{
    mouseToPosion(event);
    this->update();
}
void MySpinButton::mouseReleaseEvent(QMouseEvent * event)
{
    mouseToPosion(event);
    this->updateDegree();
}
void MySpinButton:: mouseToPosion(QMouseEvent * event)
{
    QPoint currentPoint = event->pos();
    double pi = 3.1415927;
    double  x = currentPoint.x() - whirlbuttonHeigth/2;
    double  y = currentPoint.y() - whirlbuttonWidth/2;
    if((x ==0)&&(y<=0))
        degree = 90;
    else if((x==0)&&(y>0))
        degree = 270;
    else if(x>0)
        degree = atan(y/x)*180/pi + 180;
    else if(y>0)
        degree = atan(y/x)*180/pi + 360;
    else
        degree = atan(y/x)*180/pi;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值