QwtColorMap是一个抽象基类,用于将值映射到颜色。Qwt实现了其两个派生子类QwtLinearColorMap和QwtAlphaColorMap。继承关系如下:
我们首先看看QwtColorMap的代码:
class QWT_EXPORT QwtColorMap { public: /*! Format for color mapping \sa rgb(), colorIndex(), colorTable() */ enum Format { //! The map is intended to map into QRgb values. RGB, /*! The map is intended to map into 8 bit values, that are indices into the color table. */ Indexed }; QwtColorMap( Format = QwtColorMap::RGB ); virtual ~QwtColorMap(); Format format() const; /*! Map a value of a given interval into a rgb value. \param interval Range for the values \param value Value \return rgb value, corresponding to value */ virtual QRgb rgb( const QwtInterval &interval, double value ) const = 0; /*! Map a value of a given interval into a color index \param interval Range for the values \param value Value \return color index, corresponding to value */ virtual unsigned char colorIndex( const QwtInterval &interval, double value ) const = 0; QColor color( const QwtInterval &, double value ) const; virtual QVector<QRgb> colorTable( const QwtInterval & ) const; private: Format d_format; };通过重新实现两个纯虚函数,可以根据需要定制颜色映射关系类,从而实现各种各样的颜色杆。
现在再看看QwtLinearColorMap的实现代码:
/*! Map a value of a given interval into a rgb value \param interval Range for all values \param value Value to map into a rgb value */ QRgb QwtLinearColorMap::rgb( const QwtInterval &interval, double value ) const { if ( qIsNaN(value) ) return qRgba(0, 0, 0, 0); const double width = interval.width(); double ratio = 0.0; if ( width > 0.0 ) ratio = ( value - interval.minValue() ) / width; return d_data->colorStops.rgb( d_data->mode, ratio ); } /*! Map a value of a given interval into a color index, between 0 and 255 \param interval Range for all values \param value Value to map into a color index */ unsigned char QwtLinearColorMap::colorIndex( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( qIsNaN(value) || width <= 0.0 || value <= interval.minValue() ) return 0; if ( value >= interval.maxValue() ) return ( unsigned char )255; const double ratio = ( value - interval.minValue() ) / width; unsigned char index; if ( d_data->mode == FixedColors ) index = ( unsigned char )( ratio * 255 ); // always floor else index = ( unsigned char )qRound( ratio * 255 ); return index; }
注意实现代码的细节,特别是对特殊情况的处理。