刻度尺
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.效果

天道酬勤 循序渐进 技压群雄
浙公网安备 33010602011771号