一、调用QCharts
VS项目右击->"Qt Project Setting"->切换"Qt Modules"->勾选"Charts"
包含头文件
#include <QChart>
#include <QLineSeries>
#include <QValueAxis>
#include <QCategoryAxis>......
用什么就#include
using namespace QtCharts;或者QT_CHARTS_USE_NAMESPACE
ps:
1: #include <QValueAxis>与#include <QCategoryAxis>同项目不能#include “windows.h”,会报错
解决:#include “qt_windows.h”替换#include “windows.h”
2: 在子项目和启动项中都要调用QCharts,否则还是会报警
二、创建 QCharts
1:弹出窗口
QSplineSeries *LineSeries = new QSplineSeries(); //QSplineSeries 平滑曲线 QLineSeries折线
for (double x = 0; x < 10; x += 0.1)
{
LineSeries->append(x, sin(x));
}
QChart *chart = new QChart();
chart->addSeries(LineSeries);
chart->legend()->hide();
chart->createDefaultAxes();
chart->setTheme(QChart::ChartThemeDark);QChartView *view = new QChartView(chart); //创建视图,直接是一个窗口类型
view->resize(600, 200); //
view->setWindowTitle(u8"正弦");
view->setRenderHint(QPainter::Antialiasing);
view->show();
2:Graphics View提升
双击打开"mainwindow.ui";
向"MainWindow"中添加"Graphics View"部件, 并将部件的对象名称改为"chartView";
在刚添加的部件"chartView"上右键选择菜单"提升为…", 提升的类名称设置为"QChartView", 头文件设置为"qchartview.h", 点击"添加"按钮后点击"提升"按钮;
QSplineSeries *LineSeries = new QSplineSeries(); //QSplineSeries 平滑曲线 QLineSeries折线
for (double x = 0; x < 10; x += 0.1)
{
LineSeries->append(x, sin(x));
} QChart *chart = new QChart();
chart->addSeries(LineSeries);
chart->legend()->hide();
chart->createDefaultAxes();
chart->setTheme(QChart::ChartThemeDark);ui.chartView->setChart(chart);
ui.chartView->setRenderHint(QPainter::Antialiasing);
ps:用widget也是一样,都要提升,最终都是QChartView,使用widget提升简单测试没有问题;
3:不提升,代码创建
双击打开"mainwindow.ui";
向"MainWindow"中添加"Graphics View"部件
QChartView *ChartView = new QChartView(ui.graphicsView);
QHBoxLayout *pHLayout = new QHBoxLayout(ui.graphicsView);
pHLayout->setContentsMargins(0, 0, 0, 0);
pHLayout->addWidget(ChartView);
ui.graphicsView->setLayout(pHLayout);QSplineSeries *LineSeries = new QSplineSeries(); //QSplineSeries 平滑曲线 QLineSeries折线
for (double x = 0; x < 10; x += 0.1)
{
LineSeries->append(x, sin(x));
} QChart *chart = new QChart();
chart->addSeries(LineSeries);
chart->legend()->hide();
chart->createDefaultAxes();
chart->setTheme(QChart::ChartThemeDark);ChartView ->setChart(chart);
ChartView ->setRenderHint(QPainter::Antialiasing);
三、初始化Qcharts
1:初始化QChart
QChart *m_pChart = new QChart();
// 创建图表的各个部件//m_pChart->setTitleBrush(QBrush(QColor(0, 0, 255))); //设置标题Brush
//m_pChart->setTitleFont(QFont("微软雅黑"));//设置标题字体
m_pChart->setTitle(title);
//m_pChart->legend()->setLabelColor(QColor(0, 100, 255)); //设置标签颜色
//m_pChart->legend()->hide(); //隐藏图例(图例:标题下面显示的Series)m_pChart->setTheme(QChart::ChartThemeBlueCerulean);//设置图表主题
图例被点击后触发
//foreach(QLegendMarker* marker, m_pChart->legend()->markers())
//{
// QObject::disconnect(marker, SIGNAL(clicked()), this, SLOT(on_LegendMarkerClicked()));
// QObject::connect(marker, SIGNAL(clicked()), this, SLOT(on_LegendMarkerClicked()));
//}
2:初始化 QChartView
//绑定chart控件
ui.chartView->setChart(m_pChart);// 将Chart添加到ChartView
ui.chartView->setRenderHint(QPainter::Antialiasing);//反走样功能,调用反锯齿功能
//ui.chartView->chart()->setAnimationOptions(QChart::SeriesAnimations);//设置动画模式
//ui.chartView->chart()->setDropShadowEnabled(true);//设置是否有阴影ui.chartView->setViewportUpdateMode(QChartView::FullViewportUpdate);//用于指定当视图中的场景项的边界框发生变化
ps:改变窗口大小出现重影问题,或者在显示Series标签(series->setPointLabelsVisible(true))的情况,append()数据时,标签显示不全问题,需要 ui.chartView->setViewportUpdateMode(QChartView::FullViewportUpdate)整个视口内进行更新,当然意味着更大的消耗,其默认值MinimalViewportUpdate:表示只更新发生变化的区域;
3:初始化 QAbstractSeries
QLineSeries *series = new QLineSeries();//创建直线序列
series->setName(seriesList.at(i));
// 其他附加参数
series->setVisible(true);
series->setPointLabelsFormat("@yPoint,@yPoint");//标签的显示格式也可只显示x或y
series->setPointsVisible(true); // 设置数据点可见
series->setPointLabelsVisible(true); // 设置数据点数值可见//QPen pen;
//pen.setWidth(0);
//series->setPen(pen);//series->setPen(QPen(Qt::NoPen));//画出的点不带轮廓
m_pChart->addSeries(series); // 序列添加到图表
不同的图表其实就是不同QAbstractSeries的子类,其相对应的参数不一样,其他都差不多;把数据转化为不同序列,即可显示不同的图表。
4:初始化 QValueAxis
自定义坐标轴
QValueAxis *axisX = new QValueAxis; // X轴
axisX->setRange(0, 100); // 设置坐标轴范围
axisX->setTitleText("X轴标题"); // 标题
//axisX->setLabelFormat("%d%"); // 设置x轴格式
//axisX->setTickCount(11); // 设置坐标轴主刻度的个数
// axisX->setMinorTickCount(5); //设置两个主刻度之间的次刻度的个数QValueAxis *axisY = new QValueAxis; // Y轴
axisY->setRange(0, 100); // Y轴范围
axisY->setTitleText("Y轴标题"); // 标题
axisY->setTickCount(11); // 设置坐标轴主刻度的个数m_pChart->addSeries(series);
设置X于Y轴数据集
m_pChart->setAxisX(axisX, series); // 为序列设置坐标轴
m_pChart->setAxisX(axisY, series);
或者
默认坐标轴
m_pChart->createDefaultAxes();
m_pChart->axisX()->setRange(0, 100);
....//设置坐标轴各个参数
感觉以上两种创建坐标轴本质上一样,默认createDefaultAxes只是替换掉setAxisX、setAxisX,然后创建一个简单坐标轴,如果参数不合适还是需要重新设置参数;
ps:QxxxSeries必须要先加载至chart,再setAxisX/Y,否则没有图上没有数据。addSeries一定要在坐标轴添加到图表 之前;
四、其他
QChartView用来显示数据;QChart用来组织数据。
QChart类用来管理图表的数据序列(series)、图例(legends)和坐标轴(axes)。