Qt QVCandlestickModelMapper详解
1、概述
QVCandlestickModelMapper 是 Qt 图表模块(Qt Charts)中的一个类,用于在数据模型(QAbstractItemModel 派生类)和垂直方向的烛台图(QCandlestickSeries)之间建立映射关系。
它作为数据模型和烛台图表之间的桥梁,允许开发者将模型中的数据轻松地可视化成金融领域常用的烛台图形式,无需手动处理数据同步问题。当数据模型中的数据发生变化时,烛台图会自动更新,反之亦然。
QVCandlestickModelMapper 特别适合处理按列组织的金融时间序列数据,其中每列代表烛台图的一个特定属性(开盘价、最高价、最低价、收盘价等)。
2、重要方法
void setModel(QAbstractItemModel *model)
:设置数据模型,所有烛台数据将从此模型中获取QAbstractItemModel *model() const
:返回当前使用的数据模型void setSeries(QCandlestickSeries *series)
:设置要关联的烛台序列QCandlestickSeries *series() const
:返回当前关联的烛台序列void setTimestampColumn(int column)
:设置时间戳数据所在的列索引int timestampColumn() const
:返回时间戳数据所在的列索引void setOpenColumn(int column)
:设置开盘价数据所在的列索引int openColumn() const
:返回开盘价数据所在的列索引void setHighColumn(int column)
:设置最高价数据所在的列索引int highColumn() const
:返回最高价数据所在的列索引void setLowColumn(int column)
:设置最低价数据所在的列索引int lowColumn() const
:返回最低价数据所在的列索引void setCloseColumn(int column)
:设置收盘价数据所在的列索引int closeColumn() const
:返回收盘价数据所在的列索引void setFirstRow(int firstRow)
:设置要显示的第一行数据的索引int firstRow() const
:返回当前显示的第一行数据的索引void setRowCount(int rowCount)
:设置要显示的数据行数int rowCount() const
:返回当前显示的数据行数
3、信号
void modelReplaced()
:当数据模型被替换时发射此信号void seriesReplaced()
:当烛台序列被替换时发射此信号void timestampColumnChanged()
:当时间戳列索引改变时发射此信号void openColumnChanged()
:当开盘价列索引改变时发射此信号void highColumnChanged()
:当最高价列索引改变时发射此信号void lowColumnChanged()
:当最低价列索引改变时发射此信号void closeColumnChanged()
:当收盘价列索引改变时发射此信号void firstRowChanged()
:当起始行索引改变时发射此信号void rowCountChanged()
:当显示的行数改变时发射此信号
4、常用枚举
QVCandlestickModelMapper 本身没有定义枚举类型,但它与 QCandlestickSet 中定义的数据角色配合使用:
QCandlestickSet::TimestampRole
:时间戳数据角色QCandlestickSet::OpenRole
:开盘价数据角色QCandlestickSet::HighRole
:最高价数据角色QCandlestickSet::LowRole
:最低价数据角色QCandlestickSet::CloseRole
:收盘价数据角色
这些角色对应烛台图的基本组成部分,QVCandlestickModelMapper 通过映射这些角色来构建烛台图表。
5、C++ 实例
#include <QApplication>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
#include <QtCharts/QAreaSeries>
#include <QLegend>
#include <QPieSlice>QT_CHARTS_USE_NAMESPACEint main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建主窗口和布局QWidget window;QVBoxLayout *mainLayout = new QVBoxLayout(&window);// 1. 准备数据模型 - 以垂直方式组织数据,每列代表一个K线周期QStandardItemModel *model = new QStandardItemModel(&window);model->setRowCount(5); // 有5行,分别存储时间戳、开盘价、最高价、最低价、收盘价model->setColumnCount(3); // 有3列,代表3个不同的K线周期(例如3天的数据)model->setHeaderData(0, Qt::Horizontal, "Day 1");model->setHeaderData(1, Qt::Horizontal, "Day 2");model->setHeaderData(2, Qt::Horizontal, "Day 3");// 定义数据:每个数据块代表一个K线周期(一天)// 第0行: 时间戳 (需要转换为QDateTime)model->setData(model->index(0, 0), QDateTime(QDate(2023, 10, 1), QTime(0, 0)));model->setData(model->index(0, 1), QDateTime(QDate(2023, 10, 2), QTime(0, 0)));model->setData(model->index(0, 2), QDateTime(QDate(2023, 10, 3), QTime(0, 0)));// 第1行: 开盘价 (Open)model->setData(model->index(1, 0), 100.0);model->setData(model->index(1, 1), 105.0);model->setData(model->index(1, 2), 98.0);// 第2行: 最高价 (High)model->setData(model->index(2, 0), 110.0);model->setData(model->index(2, 1), 112.0);model->setData(model->index(2, 2), 102.0);// 第3行: 最低价 (Low)model->setData(model->index(3, 0), 95.0);model->setData(model->index(3, 1), 98.0);model->setData(model->index(3, 2), 94.0);// 第4行: 收盘价 (Close)model->setData(model->index(4, 0), 105.0);model->setData(model->index(4, 1), 108.0);model->setData(model->index(4, 2), 100.0);// 创建表格视图以显示模型数据(可选,用于调试和查看)QTableView *tableView = new QTableView;tableView->setModel(model);mainLayout->addWidget(tableView);// 2. 创建蜡烛图系列QCandlestickSeries *candlestickSeries = new QCandlestickSeries();candlestickSeries->setName("Daily Stock Prices");candlestickSeries->setIncreasingColor(QColor(Qt::green)); // 上涨为绿色candlestickSeries->setDecreasingColor(QColor(Qt::red)); // 下跌为红色// 3. 创建垂直模型映射器并设置映射关系QVCandlestickModelMapper *mapper = new QVCandlestickModelMapper();mapper->setModel(model);mapper->setSeries(candlestickSeries);// 关键:设置模型中的哪些行对应蜡烛图的哪些值mapper->setTimestampRow(0); // 第0行是时间戳mapper->setOpenRow(1); // 第1行是开盘价mapper->setHighRow(2); // 第2行是最高价mapper->setLowRow(3); // 第3行是最低价mapper->setCloseRow(4); // 第4行是收盘价// 设置要映射的数据列范围(从第0列开始,到第2列结束,共3个蜡烛图项)mapper->setFirstSetColumn(0);mapper->setLastSetColumn(2);// 4. 创建图表并添加系列QChart *chart = new QChart();chart->addSeries(candlestickSeries);chart->setTitle("QVCandlestickModelMapper Example - Stock Price");chart->setAnimationOptions(QChart::SeriesAnimations);// 5. 创建坐标轴// 时间轴作为X轴QDateTimeAxis *axisX = new QDateTimeAxis;axisX->setFormat("yyyy-MM-dd");axisX->setTitleText("Date");chart->addAxis(axisX, Qt::AlignBottom);candlestickSeries->attachAxis(axisX);// 价格轴作为Y轴QValueAxis *axisY = new QValueAxis;axisY->setTitleText("Price");chart->addAxis(axisY, Qt::AlignLeft);candlestickSeries->attachAxis(axisY);// 6. 创建图表视图QChartView *chartView = new QChartView(chart);chartView->setRenderHint(QPainter::Antialiasing);mainLayout->addWidget(chartView);window.resize(800, 600);window.show();return a.exec();
}
觉得有帮助的话,打赏一下呗。。
需要商务合作(定制程序)的欢迎私信!!