刻度尺

1.h

#ifndef BARRULER_H
#define BARRULER_H

#include <QWidget>

namespace Ui {
class barruler;
}

class barruler : public QWidget
{
    Q_OBJECT

public:
    explicit barruler(QWidget *parent = 0);
    ~barruler();
    void setbar_color(QColor);
protected:
    void paintEvent(QPaintEvent *event);
    //画竖线,画横线,画文字,画矩形
    void draw_bg(QPainter & painter);
    void draw_line(QPainter & painter);
    void draw_num(QPainter & painter);
    void draw_rect(QPainter & painter);
    void draw_bar(QPainter & painter);
    void updateValue();
private:
    Ui::barruler *ui;
    qreal one_part;//一个格格的长度
    int part_num;
    int num;//理论num
    QColor bar_color;

};

#endif // BARRULER_H

 2.cpp

#include "barruler.h"
#include "ui_barruler.h"
#include <QPainter>
#include <QTimer>
#include <QTime>
#include <QDebug>
barruler::barruler(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::barruler)
{
    ui->setupUi(this);
    part_num=0;
    num=0;
    QTimer *timer =new QTimer(this);
    timer->setInterval(10);
    connect(timer,&QTimer::timeout,this,&barruler::updateValue);
    timer->start();
    //事实上,如果只有这个图像,就是这样,因为setGeometry: Unable to set geometry 100x200+910+404 on QWidgetWindow/'barrulerWindow'. Resulting geometry:  180x200+910+404 (frame: 11, 45, 11, 11, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
    //这是上面的三个按钮所决定的,无法改变
    bar_color=QColor(0, 255, 255);
}

barruler::~barruler()
{
    delete ui;
}

void barruler::setbar_color(QColor color)
{
    bar_color=color;
}

void barruler::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
    draw_bg(painter);
    draw_line(painter);
    draw_num(painter);
    draw_rect(painter);
    draw_bar(painter);

}

void barruler::draw_bg(QPainter &painter)
{
    painter.save();
    QLinearGradient bgGradient(QPointF(0,0),QPointF(0,height()));
    bgGradient.setColorAt(0.0,QColor(100, 100, 100));
    bgGradient.setColorAt(1.0,QColor(60, 60, 60));
    painter.setBrush(bgGradient);
    painter.drawRect(rect());
    painter.restore();
}

void barruler::draw_line(QPainter &painter)
{
    painter.save();

    painter.translate(40,20);//偏移
    QPen pen;
    pen.setColor(QColor(255,255,255));
    pen.setWidth(1);
    painter.setPen(pen);
    painter.drawLine(QPoint(0,0),QPoint(0,height()-40));

    for(int i=100;i>=0;i--)
    {
        int len;
        if(i%10==0){
            //长线
            len=10;
       }
        else{
            len=5;
        }
        qreal Y=1.0*(100-i)*(height()-40)/100;
        painter.drawLine(QPointF(0,Y),QPointF(len,Y));
    }
    painter.restore();
}

void barruler::draw_num(QPainter &painter)
{
    painter.save();

    painter.translate(40,20);
    QPen pen;
    pen.setColor(QColor(255,255,255));
    pen.setWidth(2);
    painter.setPen(pen);

    for(int i=100;i>=0;i=i-10)
    {
        qreal Y=1.0*(100-i)*(height()-40)/100;
        QRectF rect(-60,Y-20,55,40);
        painter.drawText(rect,Qt::AlignRight|Qt::AlignVCenter,QString::number(i));
    }
    painter.restore();
}

void barruler::draw_rect(QPainter &painter)
{
    painter.save();
    painter.translate(40+10+3,20);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(220, 220, 220)));
    painter.drawRect(0,0,width()-(40+10+3)-20,height()-40);

    painter.restore();
}

void barruler::draw_bar(QPainter &painter)
{
    painter.save();
    painter.translate(40+10+3,height()-20);
    painter.setPen(Qt::NoPen);
    //颜色:
    //100, 184, 255
    //255, 107, 107
    //24, 189, 155
    //0, 255, 255
    painter.setBrush(QBrush(bar_color));
    one_part=1.0*(height()-40)/100;
    painter.drawRect(0,-one_part*part_num,width()-(40+10+3)-20,one_part*part_num);

    painter.restore();
}

void barruler::updateValue()
{
    //qDebug()<<"updateValue()";
//    qDebug()<<num<<part_num;
    //随机产生一个数,然后靠近,到了之后再随机产生一个数,不断循环
    if(num==part_num){
        QTime t=QTime::currentTime();
        //qsrand(t.msec()+t.second()*1000);
        num=qrand()%100;
        qDebug()<<num;
    }
    else if(num>part_num){
            part_num++;
            update();
    }
    else if(num<part_num){
            part_num--;
            update();
//            qDebug()<<part_num;
    }
}

 3.效果

 

posted @ 2024-12-03 09:53  wuyuan2011woaini  阅读(20)  评论(0编辑  收藏  举报