qt QHXYModelMapper详解
1、概述
QHXYModelMapper
类是用于线、样条线和散点系列的水平模型映射器。它允许使用从 QAbstractItemModel
类派生的数据模型作为图表的数据源。水平模型映射器用于在线条、样条线或散点图系列与具有 X and Y 行表示坐标,列表示 XYSeries 的数据点。TableModel
是该模型的自然选择。模型和系列属性均可用于操作数据,模型映射器使系列和数据模型保持同步。
2、重要方法
QHXYModelMapper::QHXYModelMapper(QObject *parent = nullptr)
,构造一个映射器对象,该对象是 parent
。
void setModel(QAbstractItemModel *model)
,设置映射器使用的模型。
void setSeries(QXYSeries *series)
,设置映射器所使用的系列。当将系列设置为映射器时,系列中的所有数据都将被丢弃。当指定新系列时,旧系列将断开连接(但会保留其数据)。
void setXRow(int xRow)
,设置包含数据点 x 坐标的模型行。
void setYRow(int yRow)
,设置包含数据点 y 坐标的模型行。
void setFirstColumn(int firstColumn)
,设置包含该系列第一个点的数据的模型列。
void setColumnCount(int columnCount)
,设置映射为系列数据的模型的列数。
3、信号
columnCountChanged:当列数发生变化时发出此信号。
firstColumnChanged:当第一列发生变化时发出此信号。
modelReplaced:当映射器连接到的模型发生变化时发出此信号。
seriesReplaced:当映射器所连接的系列发生变化时发出此信号。
xRowChanged:当包含数据点 x 坐标的行发生变化时发出此信号。
yRowChanged:当包含数据点 y 坐标的行发生变化时发出此信号。
4、cpp实例
#include <QApplication>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
#include <QtCharts/QAreaSeries>
#include <QLegend>
#include <QHCandlestickModelMapper>QT_CHARTS_USE_NAMESPACE// 创建一个自定义模型,用于存储数据
class CustomModel : public QStandardItemModel
{
public:CustomModel(QObject *parent = nullptr): QStandardItemModel(parent){// 设置列数setColumnCount(3);setRowCount(5);// 设置表头setHeaderData(0, Qt::Horizontal, "X Value");setHeaderData(1, Qt::Horizontal, "Y1 Value");setHeaderData(2, Qt::Horizontal, "Y2 Value");// 填充一些示例数据for (int row = 0; row < rowCount(); ++row) {// X 值 (第0列)setData(index(row, 0), row * 2);// Y1 值 (第1列)setData(index(row, 1), QRandomGenerator::global()->bounded(10));// Y2 值 (第2列)setData(index(row, 2), QRandomGenerator::global()->bounded(15));}}
};int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建主窗口和布局QWidget window;QVBoxLayout *mainLayout = new QVBoxLayout(&window);// 创建模型CustomModel *model = new CustomModel(&window);// 创建表格视图并设置模型QTableView *tableView = new QTableView;tableView->setModel(model);mainLayout->addWidget(tableView);// 创建图表视图QChartView *chartView = new QChartView;chartView->setRenderHint(QPainter::Antialiasing);mainLayout->addWidget(chartView);// 创建图表QChart *chart = new QChart;chart->setTitle("QHXYModelMapper 示例");chartView->setChart(chart);// 创建第一个系列(折线系列)QLineSeries *series1 = new QLineSeries;series1->setName("系列 1");// 创建第一个水平模型映射器QHXYModelMapper *mapper1 = new QHXYModelMapper(&window);mapper1->setXRow(0); // 使用第0列作为X坐标mapper1->setYRow(1); // 使用第1列作为Y坐标mapper1->setFirstColumn(0); // 从第0列开始mapper1->setColumnCount(model->columnCount()); // 设置列数mapper1->setSeries(series1); // 设置要映射的系列mapper1->setModel(model); // 设置数据模型// 创建第二个系列(散点系列)QScatterSeries *series2 = new QScatterSeries;series2->setName("系列 2");series2->setMarkerSize(10.0);// 创建第二个水平模型映射器QHXYModelMapper *mapper2 = new QHXYModelMapper(&window);mapper2->setXRow(0); // 使用第0列作为X坐标mapper2->setYRow(2); // 使用第2列作为Y坐标mapper2->setFirstColumn(0); // 从第0列开始mapper2->setColumnCount(model->columnCount()); // 设置列数mapper2->setSeries(series2); // 设置要映射的系列mapper2->setModel(model); // 设置数据模型// 将系列添加到图表chart->addSeries(series1);chart->addSeries(series2);// 创建默认坐标轴chart->createDefaultAxes();// 设置窗口大小并显示window.resize(800, 600);window.show();return a.exec();
}
觉得有帮助的话,打赏一下呗。。
需要商务合作(定制程序)的欢迎私信!!