基于QCustomPlot实现色条(ColorBar)

一、简介

通过QCustomPlot实现ColorBar,直观显示各个位置的异常情况。实现效果如下,
在这里插入图片描述

二、源码

  1. CPColorBar.hpp
// CPColorBar.hpp
#pragma once
#include "qcustomplot.h"

#include <QHash>

class QCP_LIB_DECL CPColorBarData {
   
   
public:
    CPColorBarData() : key(0), value(0) {
   
   }

    CPColorBarData(double key, double value) : key(key), value(value) {
   
   }

    inline double sortKey() const {
   
   
        return key;
    }
    inline static CPColorBarData fromSortKey(double sortKey) {
   
   
        return CPColorBarData{
   
   sortKey, 0};
    }
    inline static bool sortKeyIsMainKey() {
   
   
        return true;
    }

    inline double mainKey() const {
   
   
        return key;
    }
    inline double mainValue() const {
   
   
        return value;
    }

    inline QCPRange valueRange() const {
   
   
        return QCPRange{
   
   value, value};
    }

    double key, value;
};
Q_DECLARE_TYPEINFO(CPColorBarData, Q_PRIMITIVE_TYPE);


typedef QCPDataContainer<CPColorBarData> QCPColorBarDataContainer;

class QCP_LIB_DECL CPColorBar : public QCPAbstractPlottable1D<CPColorBarData> {
   
   
    Q_OBJECT
    Q_PROPERTY(double width READ width WRITE setWidth)

public:
    explicit CPColorBar(QCPAxis* keyAxis, QCPAxis* valueAxis);
    virtual ~CPColorBar() Q_DECL_OVERRIDE;

    // getters
    double width() const {
   
   
        return mWidth;
    }
    QSharedPointer<QCPColorBarDataContainer> data() const {
   
   
        return mDataContainer;
    }

    // setters
    void setData(QSharedPointer<QCPColorBarDataContainer> data);
    void setData(const QVector<double>& keys, const QVector<double>& values, bool alreadySorted = false);
    void setWidth(double width);
    void setColor(const QHash<int, QColor>& color);

    // 非属性方法
    void addData(const QVector<double>& keys, const QVector<double>& values, bool alreadySorted = false) const;
    void addData(double key, double value);

    // 重新实现的虚方法
    virtual QCPDataSelection selectTestRect(const QRectF& rect, bool onlySelectable) const Q_DECL_OVERRIDE;
    virtual double selectTest(
        const QPointF& pos, bool onlySelectable, QVariant* details = nullptr) const Q_DECL_OVERRIDE;
    virtual QCPRange getKeyRange(bool& foundRange, QCP::SignDomain inSignDomain = QCP::sdBoth) const Q_DECL_OVERRIDE;
    virtual QCPRange getValueRange(bool& foundRange, QCP::SignDomain inSignDomain = QCP::sdBoth,
        const QCPRange& inKeyRange = QCPRange()) const Q_DECL_OVERRIDE;
    virtual QPointF dataPixelPosition(int index) const Q_DECL_OVERRIDE;

protected:
    // 属性成员
    double mWidth;
    QHash<int, QColor> mColor;

    virtual void draw(QCPPainter* painter) Q_DECL_OVERRIDE;
    virtual void drawLegendIcon(QCPPainter* painter, const QRectF& rect) const Q_DECL_OVERRIDE;

    void getVisibleDataBounds(
        QCPColorBarDataContainer::const_iterator& begin, QCPColorBarDataContainer::const_iterator& end) const;

    friend class QCustomPlot;

private:
    void getOptimizedBarData(QVector<CPColorBarData>* barData, const QCPColorBarDataContainer::const_iterator& begin,
        const QCPColorBarDataContainer::const_iterator& end) const;

    bool mAdaptiveSampling; // 自适应采样
};

  1. CPColorBar.cpp
// CPColorBar.cpp
#include "CPColorBar.hpp"

#include <algorithm>
#include <limits>

CPColorBar::CPColorBar(QCPAxis* keyAxis, QCPAxis* valueAxis)
    : QCPAbstractPlottable1D<CPColorBarData>(keyAxis, valueAxis), mWidth{
   
   1}, mAdaptiveSampling
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值