0.前置知识
在Qt Charts模块中,QChartView
和 QChart
是两个密切相关的类,它们共同用于创建和显示图表。以下是它们之间的关系和各自的角色:
-
QChart:
QChart
是一个核心类,代表图表本身。它负责管理图表的数据系列(QAbstractSeries
对象)、图表的轴(QValueAxis
或QCategoryAxis
等)以及其他图表元素。- 你可以使用
QChart
来添加数据系列、设置轴、定义图表类型(如折线图、柱状图、饼图等)。 QChart
还提供了一些方法来自定义图表的外观和行为,例如设置标题、图例、动画等。
-
QChartView:
QChartView
是一个视图类,用于显示QChart
对象。它是一个QWidget
的子类,可以像其他Qt控件一样嵌入到用户界面中。QChartView
提供了一个交互式的图表视图,允许用户通过缩放、拖动等操作来查看图表的不同部分。- 你可以将
QChart
对象设置为QChartView
的图表源,从而在视图中显示图表。
关系
QChartView
持有一个QChart
对象的引用,并负责显示这个图表。QChart
包含了图表的所有数据和逻辑,而QChartView
则提供了一个可视化的界面来展示这些数据。
示例
以下是一个简单的示例,展示如何创建一个图表并将其显示在一个视图中:
#include <QtCharts/QtCharts>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建一个图表
QChart *chart = new QChart();
chart->setTitle("Sample Chart");
chart->setAnimationOptions(QChart::AllAnimations); // 启用动画
// 创建一个数据系列
QLineSeries *series = new QLineSeries();
series->append(1, 2);
series->append(2, 3);
series->append(3, 5);
series->append(4, 7);
// 将数据系列添加到图表
chart->addSeries(series);
// 创建一个图表视图
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing); // 启用反锯齿渲染
// 显示图表视图
chartView->show();
return app.exec();
}
在这个示例中:
QChart
对象chart
被创建并设置了标题和动画选项。QLineSeries
对象series
被创建并添加了一些数据点。series
被添加到chart
中。QChartView
对象chartView
被创建并设置了图表源为chart
。chartView
被显示在用户界面中。
通过这种方式,QChart
和 QChartView
共同工作,提供了一个功能强大且易于使用的图表解决方案。
1.曲线图
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1、创建图表视图对象和图表对象
QChartView *chartview = new QChartView(this);
QChart *chart = new QChart(); // 创建图表
chart->setTitle("图表测试--正弦余弦曲线");
chartview->setChart(chart); // 将图标添加到图标视图
this->setCentralWidget(chartview); // 将图表视图展示到窗口中间
// 2、创建坐标轴
QValueAxis *ax = new QValueAxis;
ax->setRange(0,10);
QValueAxis *ay = new QValueAxis;
ay->setRange(-2, 2);
chart->addAxis(ax, Qt::AlignBottom);
chart->addAxis(ay, Qt::AlignLeft);
// 3、创建曲线
QLineSeries *s1 = new QLineSeries();
QLineSeries *s2 = new QLineSeries();
s1->setName("正弦曲线");
s2->setName("余弦曲线");
// 为曲线添加坐标值
qreal t = 0, y1,y2,iv=0.1;
int cnt = 100;
for (int i = 0; i < cnt; i++)
{
y1 = qSin(t);
s1->append(t,y1);
y2 = qSin(t+20);
s2->append(t,y2);
t = t + iv;
}
chart->addSeries(s1);
chart->addSeries(s2);
// 4、曲线关联坐标轴
s1->attachAxis(ax);
s1->attachAxis(ay);
s2->attachAxis(ax);
s2->attachAxis(ay);
// 移除的方法,为图添加坐标轴,并关联
// chart->setAxisX(ax, s1);
// chart->setAxisY(ay, s1);
// chart->setAxisX(ax, s2);
// chart->setAxisY(ay, s2);
}
2. 折线图
void ZheXian::mySelflinerSeriesFunc()
{
QChart *ct = new QChart();
ct->setTitle("折线图");
ui->graphicsView->setChart(ct);
// 设置坐标
QValueAxis *ax = new QValueAxis();
ax->setTitleText("年份");
ax->setRange(2017, 2021);
ax->setTickCount(5);
ax->setLineVisible(true);
ax->setGridLineVisible(false);
QValueAxis *ay = new QValueAxis();
ay->setTitleText("经费");
ay->setRange(2000, 10000);
ay->setTickCount(5);
ay->setLineVisible(true);
ay->setGridLineVisible(false);
ct->addAxis(ax, Qt::AlignBottom);
ct->addAxis(ay, Qt::AlignLeft);
// 绘制折线图,设置序列
QLineSeries *s1 = new QLineSeries();
s1->setName("中国");
s1->setColor(QColor(255, 0, 0));
ct->addSeries(s1);
s1->attachAxis(ax);
s1->attachAxis(ay);
// 添加点
s1->append(2017, 5000);
s1->append(2018, 6500);
s1->append(2019, 4900);
s1->append(2020, 8000);
s1->append(2021, 9000);
// 另一种添加数据的方法
// *s1 << QPointF(2017, 5000) << QPointF(2018, 6500) << QPointF(2019, 4900) << QPointF(2020, 8000) << QPointF(2021, 9000);
}
3. 柱形图
ZhuXingTu::ZhuXingTu(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::ZhuXingTu)
{
ui->setupUi(this);
// 1、创建图表
QChart *ct = new QChart();
ct->setTitle("柱形图");
ui->graphicsView->setChart(ct);
// 2、创建柱形图的值集合
QBarSet *bar = new QBarSet("bar");
*bar << 560 << 599 << 688 << 701; // 添加值
// 3、根据值集合创建柱形
QStackedBarSeries *s1 = new QStackedBarSeries();
s1->append(bar);
ct->addSeries(s1);
// 4、设置柱形类别 X轴
QStringList strlist = {"1", "2", "3", "4"};
QBarCategoryAxis *axValue = new QBarCategoryAxis;
axValue->append(strlist);
axValue->setTitleText("姓名");
axValue->setGridLineVisible(false);
ct->addAxis(axValue, Qt::AlignBottom);
QValueAxis *ay = new QValueAxis();
ay->setRange(0, 750);
ay->setTitleText("分数");
ay->setGridLineVisible(false);
ct->addAxis(ay, Qt::AlignLeft);
}
4.饼状图
Bingzhuangtu::Bingzhuangtu(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::Bingzhuangtu)
{
ui->setupUi(this);
// 创建图表视图和图表
QChartView *ctview = new QChartView(this);
this->setCentralWidget(ctview);
QChart *ct = new QChart();
ctview->setChart(ct);
// 创建饼状图对象 相当于曲线
QPieSeries *sris = new QPieSeries();
sris->append("70以下:30%", 30);
sris->append("70-85:40%", 40);
sris->append("85-95:25%", 25);
sris->append("95-100:15%", 15);
sris->setLabelsVisible();
// 设置颜色
QPieSlice *sred = sris->slices().at(0);
QPieSlice *sgreen = sris->slices().at(1);
QPieSlice *sblue = sris->slices().at(2);
QPieSlice *sblack = sris->slices().at(3);
sred->setColor(QColor(255,0,0,255));
sgreen->setColor(QColor(0,255,0,255));
sblue->setColor(QColor(0,0,255,255));
sblack->setColor(QColor(0,0,0,255));
ct->addSeries(sris);
ct->setTitle("饼状图");
}
标签:数据分析,Qt,QChart,s1,chart,图表,详解,ay,new
From: https://www.cnblogs.com/xuejx/p/18313518