一、简介
通过QCustomPlot实现ColorBar,直观显示各个位置的异常情况。实现效果如下,

二、源码
- 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; // 自适应采样
};
- CPColorBar.cpp
// CPColorBar.cpp
#include "CPColorBar.hpp"
#include <algorithm>
#include <limits>
CPColorBar::CPColorBar(QCPAxis* keyAxis, QCPAxis* valueAxis)
: QCPAbstractPlottable1D<CPColorBarData>(keyAxis, valueAxis), mWidth{
1}, mAdaptiveSampling

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



