• 6534阅读
  • 4回复

[原创]QSpeedMeter [复制链接]

上一主题 下一主题
离线flyingking
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-24
#ifndef QSPEEDMETER_H
#define QSPEEDMETER_H
#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
class QSpeedMeter : public QWidget
{
    Q_OBJECT
public:
    explicit QSpeedMeter(QWidget *parent = 0);
    void setVal(int val);
    void setFontSize(int val_f, int scale_f);
    void setMeterAttribute(int val_max, int ticks);
protected:
    void paintEvent(QPaintEvent *);
private:
    int max;
    int tick_num;
    int cur_val;
    int val_fsize;
    int scale_fsize;
    QString unit;
};
#endif // QSPEEDMETER_H

#include "qspeedmeter.h"
#include <QRadialGradient>
#include <QFont>
QSpeedMeter::QSpeedMeter(QWidget *parent) :
    QWidget(parent)
{
    max      = 240;
    tick_num = 8;
    cur_val  = 80;
    val_fsize= 16;
    scale_fsize = 12;
    unit = "km/h";
}
void QSpeedMeter::setVal(int val)
{
    cur_val = val;
    this->update();
}
void QSpeedMeter::setFontSize(int val_f, int scale_f)
{
    val_fsize = val_f;
    scale_fsize = scale_f;
    this->update();
}
void QSpeedMeter::setMeterAttribute(int val_max, int ticks)
{
    max = val_max;
    tick_num = ticks;
}
void QSpeedMeter::paintEvent(QPaintEvent *)
{
    int width  = this->width();
    int height = this->height();
    /* Initialize painter */
    QPainter *painter = new QPainter(this);
    painter->setRenderHint(QPainter::Antialiasing);
    painter->translate( width/2, height/2 );
    int radius = qMin(width, height)/2 - 2;
    painter->setViewport(-radius, -radius, radius, radius);
    painter->setWindow(-radius, -radius, radius, radius);
    //------------------------------------------------------------
    // 画外圈
    QRadialGradient haloGradientw(0, 0, radius, 0, 0);
    haloGradientw.setColorAt(0.0, Qt::lightGray);
    haloGradientw.setColorAt(0.8, Qt::darkGray);
    haloGradientw.setColorAt(0.9, Qt::white);
    haloGradientw.setColorAt(1.0, Qt::black);
    painter->setPen(Qt::NoPen);
    painter->setBrush(haloGradientw);
    painter->drawEllipse( QPoint(0, 0), radius, radius);
    painter->setBrush(Qt::black);
    painter->drawEllipse(QPoint(0, 0), radius*9/10, radius*9/10);
    QFont font;
    font.setPixelSize(scale_fsize);
    painter->setFont(font);
    //------------------------------------------------------------
    // 画刻度
    qreal angle = 270.0/(tick_num*2);
    painter->setPen(Qt::green);
    int step = max / tick_num;
    for ( int i=0; i<=tick_num*2;i++ )
    {
        painter->save();
        painter->rotate(225 + angle * i) ;
        if(i & 0x1)
        {
            painter->drawLine(QPoint(0,-radius*7/10), QPoint(0,-radius*13/20));
        }
        else
        {
            painter->drawLine(QPoint(0,-radius*7/10), QPoint(0,-radius*6/10));
            QString text = QString().sprintf("%d", i*step/2);
            QSize size = painter->fontMetrics().size(Qt::TextSingleLine, text);
            painter->drawText(QRectF(-size.width()/2, -radius*9/10 + 2,
                                    size.width(), size.height()),
                                    Qt::AlignCenter, text );
        }
        painter->restore();
    }
    angle = 270.0/max;
    angle *= cur_val;
    //------------------------------------------------------------
    //画指针
    const QPoint needle[5] = {
            QPoint(0, -radius*13/20 ),
            QPoint(2, 0),
            QPoint(radius/20, radius/5),
            QPoint(-radius/20, radius/5),
            QPoint(-2, 0)
    };
    painter->setPen(Qt::NoPen);
    painter->setBrush(QColor(100,255,100,120));
    painter->save();
    painter->rotate(225 + angle);
    painter->drawPolygon(needle, 5);
    painter->restore();
    painter->setBrush(Qt::red);
    painter->drawEllipse(QPoint(0,0), 5, 5);
    //--------------------------------------------------------------------------------
    //显示当前数据和单位
    font.setPointSize(val_fsize);
    painter->setFont(font);
    painter->setPen(Qt::green);
    QString text = QString().sprintf("%d", cur_val);
    QSize size = painter->fontMetrics().size(Qt::TextSingleLine, text);
    painter->drawText( QRectF(-size.width()/2, radius*2/7,
                             size.width(), size.height()),
                      Qt::AlignCenter, text );
    size = painter->fontMetrics().size(Qt::TextSingleLine, unit);
    painter->drawText(QRectF(-size.width()/2, -(radius*1/4+size.height()/2),
                            size.width(), size.height()),
                     Qt::AlignCenter, unit);
    painter->end();
}

离线robotarm
只看该作者 1楼 发表于: 2011-03-24
呵呵,不错啊,要是指针可以动就好了,
离线梅克斯
只看该作者 2楼 发表于: 2011-03-24
支持了
离线flyingking
只看该作者 3楼 发表于: 2011-03-25
悲剧,在2440上居然显示不出来,QT-4.6编译的

只看该作者 4楼 发表于: 2014-03-11
请问怎么能够让指针动态的动起来?试了很久都是只能显示一个值。
快速回复
限100 字节
 
上一个 下一个