LColorMap 类说明:
jet颜色条,一共由343个颜色块。开放的接口有:
void setMinMax(double min,double max);// 设置最大值和最小值
QColor getColor(double value);// 根据传入的值(介于最大值和最小值之间),获取颜色
注意事项:这个LColorMap 的高度不能小于343 + 20
源码:
LCOLORMAP_H
#ifndef LCOLORMAP_H
#define LCOLORMAP_H
#include <QWidget>
class LColorMap : public QWidget
{
Q_OBJECT
public:
explicit LColorMap(QWidget *parent = nullptr);
QColor getColor(double value);
protected:
void paintEvent(QPaintEvent *event) override;
signals:
public slots:
void setMinMax(double min,double max);
private:
QVector<QColor> colors;// 颜色数组
double min = 0;
double max = 100;
};
#endif // LCOLORMAP_H
LCOLORMAP_CPP
#include "lcolormap.h"
#include <QPainter>
#include <QDebug>
LColorMap::LColorMap(QWidget *parent) : QWidget(parent)
{
// 计算colors
float colorBarLength = 343.0;
float tempLength=colorBarLength/4;
QColor color;
for(int i=0;i<tempLength/2;i++)// jet
{
color.setRgbF(0,0,(tempLength/2+i)/tempLength);
colors.push_back(color);
}
for(int i=tempLength/2+1;i<tempLength/2+tempLength;i++)// jet
{
color.setRgbF(0,(i-tempLength/2)/tempLength,1);
colors.push_back(color);
}
for(int i=tempLength/2+tempLength+1;i<tempLength/2+2*tempLength;i++)// jet
{
color.setRgbF((i-tempLength-tempLength/2)/tempLength,1,(tempLength*2+tempLength/2-i)/tempLength);
colors.push_back(color);
}
for(int i=tempLength/2+2*tempLength+1;i<tempLength/2+3*tempLength;i++)// jet
{
color.setRgbF(1,(tempLength*3+tempLength/2-i)/tempLength,0);
colors.push_back(color);
}
for(int i=tempLength/2+3*tempLength+1;i<colorBarLength;i++)// jet
{
color.setRgbF((colorBarLength-i+tempLength/2)/(tempLength),0,0);
if (color == QColor(0,0,0))
qDebug()<<"black color";
colors.push_back(color);
}
qDebug()<<"colors's num: "<<colors.size();
}
void LColorMap::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
if (height() < 343)
return;
for (int i =0 ;i<343;i++) {
QRect rect(0,343-i + 20,20,1);
painter.fillRect(rect,colors.at(i));
}
for (int i = 0;i < 6;i++) {
QString strValue;
strValue.sprintf("%.2f",min+i*(max-min)/5);
QFont font;
font.setFamily("Microsoft YaHei");
font.setPointSize(8);
QFontMetrics fm(font);
QRect rec = fm.boundingRect(strValue);
//字符串所占的像素宽度,高度
int textWidth = rec.width();
int textHeight = rec.height();
QRect textRect(25,343 +textHeight - (343/5)*i,textWidth+20,textHeight);
painter.drawText(textRect,strValue);
}
}
void LColorMap::setMinMax(double min,double max)
{
this->min = min;
this->max = max;
update();
}
QColor LColorMap::getColor(double value)
{
if (value > max || value <min)
return QColor(0,0,0);
int index = ((value-min)/(max-min))*343;
return colors.at(index);
}
mian.cpp
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include "lcolormap.h"
#include <QDebug>
//class PainterWidget : public QWidget
//{
// protected:
// void paintEvent(QPaintEvent*);
//};
//void PainterWidget::paintEvent(QPaintEvent *event)
//{
// QPainter painter(this);
// QColor color;
// QRect section;
// float colorBarLength=343.0;//设置颜色条的长度
// //------设置为gray颜色条---------//
// for(int i=0;i<=colorBarLength;i++)// gray
// {
// //color.setRgbF(i/colorBarLength,i/colorBarLength,i/colorBarLength);//也可以使用这种方法
// color.setHsv(0,0,(colorBarLength-i)/colorBarLength*255);
// section.setRect(150,50+i*1,20,1);
// painter.fillRect(section,color);
// }
// //------设置为jet颜色条---------//
// float tempLength=colorBarLength/4;
// for(int i=0;i<tempLength/2;i++)// jet
// {
// color.setRgbF(0,0,(tempLength/2+i)/tempLength);
// section.setRect(200,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// for(int i=tempLength/2+1;i<tempLength/2+tempLength;i++)// jet
// {
// color.setRgbF(0,(i-tempLength/2)/tempLength,1);
// section.setRect(200,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// for(int i=tempLength/2+tempLength+1;i<tempLength/2+2*tempLength;i++)// jet
// {
// color.setRgbF((i-tempLength-tempLength/2)/tempLength,1,(tempLength*2+tempLength/2-i)/tempLength);
// section.setRect(200,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// for(int i=tempLength/2+2*tempLength+1;i<tempLength/2+3*tempLength;i++)// jet
// {
// color.setRgbF(1,(tempLength*3+tempLength/2-i)/tempLength,0);
// section.setRect(200,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// for(int i=tempLength/2+3*tempLength+1;i<colorBarLength;i++)// jet
// {
// color.setRgbF((colorBarLength-i+tempLength/2)/(tempLength),0,0);
// section.setRect(200,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// //------设置为hsv颜色条---------//
// for(int i=0;i<=colorBarLength;i++)// hsv
// {
// color.setHsvF(i/colorBarLength,1,1);
// section.setRect(250,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// //------设置为hot颜色条---------//
// tempLength=colorBarLength/2.5;
// for(int i=0;i<tempLength/2;i++)// hot
// {
// color.setRgbF((tempLength/2+i)/tempLength,0,0);
// section.setRect(300,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// for(int i=tempLength/2+1;i<tempLength/2+tempLength;i++)// hot
// {
// color.setRgbF(1,(i-tempLength/2)/tempLength,0);
// section.setRect(300,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// for(int i=tempLength/2+tempLength+1;i<colorBarLength;i++)// hot
// {
// color.setRgbF(1,1,(i-tempLength/2-tempLength)/(colorBarLength-tempLength/2-tempLength+20));
// section.setRect(300,colorBarLength+50-i*1,20,1);
// painter.fillRect(section,color);
// }
// //---------设置边框--------------//
// //刻度值的绘制可以自己设计,使用drawText函数即可,刻度的绘制可以使用drawLine函数
// painter.setPen(Qt::black);
// painter.drawRect(150,50,20,colorBarLength);
// painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
// painter.drawText(150,40,QStringLiteral("Gray"));
// painter.drawRect(200,50,20,colorBarLength);
// painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
// painter.drawText(200,40,QStringLiteral("Jet"));
// painter.drawRect(250,50,20,colorBarLength);
// painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
// painter.drawText(250,40,QStringLiteral("Hsv"));
// painter.drawRect(300,50,20,colorBarLength);
// painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
// painter.drawText(300,40,QStringLiteral("Hot"));
// // painter.drawText(150,320,QStringLiteral(" 0"));
//}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// PainterWidget pWidget;
// pWidget.setWindowTitle("ColorTest");
// pWidget.resize(500, 500);
// pWidget.show();
LColorMap lcolorMap;
lcolorMap.setWindowTitle("ColorMap");
lcolorMap.resize(500,500);
lcolorMap.show();
lcolorMap.setMinMax(3,9);
qDebug()<<lcolorMap.getColor(3.2);
return app.exec();
}