【Qt】QChart折线图

引言

Qt绘图(Qt Charts)基于Qt的Graphics View架构,其核心组件是QChartViewQChart

  • QChartView是显示图标的视图,基类为QGraphicsView
  • QChart的基类是QGraphicsltem
    可以看作是视图和数据分离,即ViewModel

QChartView

QChartView 是一个独立的小部件,继承于 QGraphicsView 类。它可以直接在用户界面中显示图表。这使得在应用程序中集成图表变得简单,而无需复杂的图形场景设置。

QChart

QChart是继承于QGraphicsWidget,可以在QGraphicsScene上显示,用来管理图表中的数据、图例、坐标轴等。

示例

cpp 复制代码
// .h
#ifndef __WIDGET_H__
#define __WIDGET_H__

#include <QtWidgets/QWidget>

class Widget : public QWidget
{
public:
	Widget();
	~Widget();

public:
	void createLineSeries(const std::pair<QString, std::vector<int>>& pair);

private:
	class Impl;
	std::unique_ptr<Impl> impl_;
};

#endif // __WIDGET_H__

// .cpp
#include "Widget.h"

#include <QtCharts/QLineSeries>
#include <QtCharts/QChartView>
#include <QtCharts/QChart>
#include <QtCharts/QValueAxis>

#include <QVBoxLayout>

#include <algorithm>
#include <vector>

QT_CHARTS_USE_NAMESPACE

class Widget::Impl
{
public:
	Impl();
	~Impl() = default;

public:
	QChart *chart_ = nullptr;
};

Widget::Widget()
	:QWidget(),
	impl_(std::make_unique<Impl>())
{
	setFixedSize(1700, 800);
	setWindowTitle(u8"亮度对比折线图");
	//创建图表框架
	
	QVBoxLayout *lay = new QVBoxLayout;
	setLayout(lay);

	impl_->chart_ = new QChart();
	impl_->chart_->legend()->setAlignment(Qt::AlignRight);

	QChartView *charView = new QChartView(this);
	charView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
	charView->setChart(impl_->chart_);

	lay->addWidget(charView);
}

Widget::~Widget()
{
}

void Widget::createLineSeries(const std::pair<QString, std::vector<int>> &pair)
{
	QLineSeries *series = new QLineSeries();
	
	series->setName(pair.first);

	for (int i = 0, sz = pair.second.size(); i < sz; i++)
	{
		series->append(i, pair.second[i]);
	}

	impl_->chart_->addSeries(series);
	//impl_->chart_->createDefaultAxes();
	QValueAxis *axisY = new QValueAxis;
	axisY->setRange(50, 200);
	axisY->setTitleText(u8"像素值");
	axisY->setLabelFormat("%i");
	impl_->chart_->addAxis(axisY, Qt::AlignLeft);

	QValueAxis *axisX = new QValueAxis;
	axisX->setRange(0, pair.second.size());
	axisX->setTitleText(u8"序号");
	axisX->setLabelFormat("%i");
	impl_->chart_->addAxis(axisX, Qt::AlignBottom);

	series->attachAxis(axisX);
	series->attachAxis(axisY);

	auto allAxisX = impl_->chart_->axes(Qt::Horizontal);
	auto allAxisY = impl_->chart_->axes(Qt::Vertical);

	for (const auto it : allAxisX)
	{
		it->hide();
	}

	for (const auto it : allAxisY)
	{
		it->hide();
	}

	(*allAxisX.begin())->show();
	(*allAxisY.begin())->show();

	update();
}

Widget::Impl::Impl()
{
}

参考文章

  1. Qt(十三)QChart绘制折线图_qt折线图-CSDN博客
  2. C++ Qt开发:Charts折线图绘制详解_qt折线图-CSDN博客
  3. QT之QCharts的使用(绘制折线图)_qt qcharts折线图-CSDN博客
  4. 学习Qt Charts-创建一个简单的折线图 - 哈拎 - 博客园 (cnblogs.com)
  5. Qt类 | QChartView类详解-CSDN博客
相关推荐
GIS阵地40 分钟前
QgsProviderMetadata 详解(基于 QGIS 3.40.13 API)
数据库·qt·arcgis·oracle·gis·开源软件·qgis
被AI抢饭碗的人4 小时前
QT:基础与信号槽
前端·qt
小温冲冲4 小时前
Qt WindowContainer 完整实战示例:QWidget 嵌入 QML
开发语言·数据库·qt
芦芭荞4 小时前
QT之TCP/IP通讯
开发语言·qt·tcp/ip
冉佳驹6 小时前
Qt 开发【第三篇】——— 核心属性解析与应用实践
qt·geometry·qicon·enabled·windowopacity·qwidget核心属性·framegeometry
code_计梦星河8 小时前
Qt 开发第十三天:打卡模块跨端数据传输及连续天数计算开发
qt
誰能久伴不乏8 小时前
从数字世界到物理引擎:用 PWM 撕开 0 和 1 的结界
linux·arm开发·c++·qt
sycmancia9 小时前
QT——第一个GUI应用程序
qt
sycmancia9 小时前
Qt——窗口部件及窗口类型、坐标系统
开发语言·qt
火山上的企鹅9 小时前
QGC 二次开发实战:Android 单机离线授权怎么落地
android·qt·qgroundconrol·离线授权