77 lines
2.2 KiB
C++
77 lines
2.2 KiB
C++
#include "CustomQwtPlot.h"
|
||
#include <QwtPlotCurve>
|
||
#include <QwtLegend>
|
||
#include <QwtPlotCanvas>
|
||
#include <QPen>
|
||
|
||
CustomQwtPlot::CustomQwtPlot(QWidget *parent)
|
||
: QwtPlot(parent)
|
||
{
|
||
|
||
}
|
||
|
||
const QList<QwtPlotCurve *> &CustomQwtPlot::GetCurveList() const
|
||
{
|
||
return _curves;
|
||
}
|
||
|
||
void CustomQwtPlot::AddCurve(QwtPlotCurve *curve)
|
||
{
|
||
if (curve) {
|
||
curve->setPen(QPen(getDistinctColorForManyCurves(_curves.count())));
|
||
curve->attach(this);
|
||
_curves.append(curve);
|
||
}
|
||
}
|
||
|
||
QColor getDistinctColorForManyCurves(int curve_index)
|
||
{
|
||
// 1. 定义基础色相(覆盖不同主色系,0-360度)
|
||
const QList<int> base_hues = {
|
||
0, // 红色
|
||
30, // 橙色
|
||
60, // 黄色
|
||
90, // 黄绿色
|
||
120, // 绿色
|
||
150, // 青绿色
|
||
180, // 青色
|
||
210, // 天蓝色
|
||
240, // 蓝色
|
||
270, // 紫色
|
||
300, // 洋红色
|
||
330 // 玫红色
|
||
};
|
||
|
||
// 2. 定义不同的饱和度/明度组合(避免颜色太暗/太灰)
|
||
const QList<QPair<int, int>> sv_combinations = {
|
||
{85, 90}, // 高饱和、高明度
|
||
{70, 85}, // 中高饱和、中高明度
|
||
{85, 75}, // 高饱和、中明度
|
||
{60, 80}, // 中饱和、中高明度
|
||
{75, 70}, // 中高饱和、中明度
|
||
{90, 80} // 极高饱和、中高明度
|
||
};
|
||
|
||
// 3. 计算当前曲线对应的色相和饱和度/明度
|
||
int hue_index = curve_index % base_hues.size(); // 循环使用基础色相
|
||
int sv_index = (curve_index / base_hues.size()) % sv_combinations.size(); // 循环使用饱和度/明度组合
|
||
|
||
// 4. 获取HSV参数(色相0-360,饱和度0-255,明度0-255)
|
||
int hue = base_hues[hue_index];
|
||
int saturation = sv_combinations[sv_index].first * 255 / 100; // 转换为0-255范围
|
||
int value = sv_combinations[sv_index].second * 255 / 100; // 转换为0-255范围
|
||
|
||
// 5. 生成并返回颜色(HSV转RGB)
|
||
QColor color;
|
||
color.setHsv(hue, saturation, value);
|
||
|
||
// 额外优化:避免极浅/极暗的颜色(保证曲线可见)
|
||
if (value < 50 * 255 / 100) {
|
||
value = 50 * 255 / 100;
|
||
color.setHsv(hue, saturation, value);
|
||
}
|
||
|
||
return color;
|
||
}
|
||
|