QCPFinancial 是 QCustomPlot 中用于绘制金融图表(如蜡烛图/K线图)的核心类。以下是其关键特性的详细说明:
一、主要属性
| 属性 | 类型 | 说明 | 
|---|---|---|
| data | QSharedPointer<QCPFinancialDataContainer> | 存储金融数据的数据容器 | 
| chartStyle | QCPFinancial::ChartStyle | 设置图表样式(蜡烛图/美国线等) | 
| width | double | 每个数据项的宽度(0-1之间) | 
| twoColored | bool | 是否使用两种颜色区分涨跌(默认true) | 
| positive | QCPScatterStyle | 上涨时的样式(颜色、形状等) | 
| negative | QCPScatterStyle | 下跌时的样式 | 
二、核心方法
1. 数据操作方法
| 方法 | 参数 | 返回值 | 说明 | 
|---|---|---|---|
| setData | QSharedPointer<QCPFinancialDataContainer> data | void | 设置完整数据集 | 
| addData | const QVector<double>& keys, const QVector<double>& open, const QVector<double>& high, const QVector<double>& low, const QVector<double>& close | void | 批量添加数据 | 
| addData | double key, double open, double high, double low, double close | void | 添加单个数据点 | 
| dataCount | - | int | 返回数据点数量 | 
2. 样式配置方法
| 方法 | 参数 | 返回值 | 说明 | 
|---|---|---|---|
| setChartStyle | QCPFinancial::ChartStyle style | void | 设置图表类型 | 
| setWidth | double width | void | 设置柱体宽度 | 
| setTwoColored | bool enabled | void | 启用/禁用双色模式 | 
| setPen | const QPen& pen | void | 设置统一线条颜色 | 
| setPositive | const QPen& pen | void | 设置上涨颜色 | 
| setNegative | const QPen& pen | void | 设置下跌颜色 | 
3. 数据查询方法
| 方法 | 参数 | 返回值 | 说明 | 
|---|---|---|---|
| getKeyRange | bool& foundRange, SignDomain inSignDomain = sdBoth | QCPRange | 获取键值范围 | 
| getValueRange | bool& foundRange, SignDomain inSignDomain = sdBoth | QCPRange | 获取数值范围 | 
| selectTest | const QPointF& pos, bool onlySelectable, QVariant* details = nullptr | double | 选择测试 | 
三、信号列表
| 信号 | 参数 | 说明 | 
|---|---|---|
| selectionChanged | bool selected | 选中状态改变时触发 | 
| selectableChanged | bool selectable | 可选状态改变时触发 | 
四、枚举类型
QCPFinancial::ChartStyle
| 值 | 说明 | 
|---|---|
| csOhlc | 美国线(开盘-高-低-收盘) | 
| csCandlestick | 蜡烛图(默认) | 
五、基本使用示例
cpp
// 创建金融图表
QCPFinancial *candlesticks = new QCPFinancial(customPlot->xAxis, customPlot->yAxis);
// 设置样式为蜡烛图
candlesticks->setChartStyle(QCPFinancial::csCandlestick);
candlesticks->setWidth(0.5);  // 设置宽度为时间间隔的50%
// 设置颜色
candlesticks->setPositive(QPen(Qt::green));
candlesticks->setNegative(QPen(Qt::red));
// 添加数据 (key, open, high, low, close)
QVector<double> keys, open, high, low, close;
// ... 填充数据 ...
candlesticks->addData(keys, open, high, low, close);
// 连接选择信号
connect(candlesticks, &QCPFinancial::selectionChanged, [](bool selected) {
    qDebug() << "K线图选择状态改变:" << selected;
});六、高级技巧
1、自定义工具提示:
cpp
connect(customPlot, &QCustomPlot::plottableClick, [](QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event) {
    if (auto financial = qobject_cast<QCPFinancial*>(plottable)) {
        auto data = financial->data()->at(dataIndex);
        QToolTip::showText(event->globalPos(), 
            QString("日期: %1\n开盘: %2\n最高: %3\n最低: %4\n收盘: %5")
                .arg(data->key).arg(data->open)
                .arg(data->high).arg(data->low)
                .arg(data->close));
    }
});2、动态更新数据:
cpp
// 更新特定位置的数据
candlesticks->data()->at(index)->close = newCloseValue;
candlesticks->data()->at(index)->high = qMax(candlesticks->data()->at(index)->high, newCloseValue);
customPlot->replot();通过以上属性和方法的组合,可以创建高度可定制的金融图表,满足股票、期货等金融数据的可视化需求。