刻度尺
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.效果
天道酬勤 循序渐进 技压群雄