QChart绘制折线图

2024-08-26 07:20
文章标签 绘制 折线图 qchart

本文主要是介绍QChart绘制折线图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一篇我们详细介绍图表各个部分的设置和操作,包括图表的标题、图例、边距等属性设置,QLineSeries序列的属性设置,QValueAxis坐标轴的属性设置,以及图标的缩放。(这些应该都是在实际的Qt开发中比较常用的图表操作)先看运行时的界面:

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240824221403.png

界面设计

  • 工具栏:创建几个Action,并创建工具栏,实现图表数据刷新和缩放功能。

  • 主工作区图标视图:从组件面板放置一个QGraphics View组件作为视图组件,并用Promote方法升级为QChartView组件,命名为chartView

  • 图表属性设置面板:左侧是一个QToolBox组件,分为3个操作面板,用于进行图表设置、曲线设置和坐标轴设置。

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240824215739.png

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240824215810.png

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

主窗口类的定义和初始化

下面是主窗口类MainWindow的类定义(省略了Action和界面组件的槽函数定义)。在mainwindow.h文件重需要包含QtChart,并使用宏QT_CHARTS_USE_NAMESPACE导入命名空间。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtCharts>
QT_CHARTS_USE_NAMESPACE
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:QLineSeries* curSeries; // 当前序列QValueAxis* curAxis; // 当前坐标轴void createChart(); // 创建图表void prepareData(); // 更新数据void updateFromChart(); // 从图表更新到界面private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

MainWindow类中定义了两个私有的变量,curSeries用于指向当前的QLineSeries序列,界面上对序列的设置操作都是针对当前选择的序列;curAxis用于指向当前的QValueAxis坐标轴,对坐标轴进行设置时就是针对当前坐标轴进行设置。

createChart()函数用于创建图表的各个基本部件,在构造函数里调用,prepareData()用于更新序列的数据,updateFormChart()用于读取图表的一些属性,并刷新界面显示。下面是主窗口构造函数,以及这3个函数的代码。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);createChart(); // 创建图表prepareData(); // 生成数据updateFromChart(); // 从图表获取属性值,刷新到界面显示
}void MainWindow::createChart()
{QChart* chart = new QChart();chart->setTitle("简单函数曲线");ui->chartView->setChart(chart);ui->chartView->setRenderHint(QPainter::Antialiasing); // 抗锯齿,平滑QLineSeries* series0 = new QLineSeries();QLineSeries* series1 = new QLineSeries();series0->setName("Sin 曲线");series1->setName("Cos 曲线");curSeries = series0;QPen pen;pen.setStyle(Qt::DotLine);pen.setWidth(2);pen.setColor(Qt::red);series0->setPen(pen);pen.setStyle(Qt::SolidLine);pen.setColor(Qt::blue);series1->setPen(pen);chart->addSeries(series0);chart->addSeries(series1);QValueAxis* axisX = new QValueAxis();curAxis = axisX;axisX->setRange(0, 10);axisX->setLabelFormat("%.1f"); // 标签格式axisX->setTickCount(11); // 主分隔个数axisX->setMinorTickCount(9); // 次分隔个数axisX->setTitleText("time(secs)"); // 标题QValueAxis* axisY = new QValueAxis();axisY->setRange(-2, 2);axisY->setTitleText("value");axisY->setTickCount(5);axisY->setLabelFormat("%.2f");axisY->setMinorTickCount(4);chart->setAxisX(axisX, series0);chart->setAxisY(axisY, series0);chart->setAxisX(axisX, series1);chart->setAxisY(axisY, series1);
}void MainWindow::prepareData()
{QLineSeries* series0 = (QLineSeries*)ui->chartView->chart()->series().at(0);QLineSeries* series1 = (QLineSeries*)ui->chartView->chart()->series().at(1);series0->clear();series1->clear();qsrand(QTime::currentTime().second()); // 初始化随机数qreal t = 0;qreal y1, y2;qreal intv = 0.1;qreal rd;int cnt = 100;for (int i = 0; i < cnt; i++) {rd = (qrand() % 10) - 5;y1 = qSin(t) + rd / 50;series0->append(t, y1);rd = (qrand() % 10) - 5;y2 = qCos(t) + rd / 50;series1->append(t, y2);t += intv;}
}void MainWindow::updateFromChart()
{QChart* chart = ui->chartView->chart();ui->editTitle->setText(chart->title());QMargins mg = chart->margins(); // 边距ui->spinMarginTop->setValue(mg.top());ui->spinMarginLeft->setValue(mg.left());ui->spinMarginRight->setValue(mg.right());ui->spinMarginBottom->setValue(mg.bottom());
}
  • MainWindow类个构造函数调用单个私有函数进行图表和界面的初始化。

  • createChart()函数用于创建QChart对象,创建数据序列和坐标轴,并将这些部件组合成一个完整的图表。

  • prepareDate()函数用于为图表重的两个序列生成数据,其中使用随机数,以便使得每次生成的数据稍有不同。

  • updateFromChart()函数用于将图表重的标题和边距信息显示到窗口界面上。

笔画设置对话框QWDialogPen

在这个demo中,需要设置一些对象的pen属性,比如折线序列的pen属性,网络先的pen属性等。pen属性其实就是一个QPen对象,设置内容主要包括线型,线宽和颜色。为了使用方便,设计一个自定义对话框QWDialogPen,专门用于QPen对象的属性设置。

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240825033758.png

QWDialogPen是一个可视化设计的对话框,其类型定义如下:

class QWDialogPen : public QDialog
{Q_OBJECTpublic:explicit QWDialogPen(QWidget *parent = nullptr);~QWDialogPen();void setPen(QPen pen); // 设置Qpen,用于对话框界面显示QPen getPen(); // 获取对话框设置的QPen属性static QPen getPen(QPen iniPen, bool& ok); //静态函数private slots:void on_btnColor_clicked();private:Ui::QWDialogPen *ui;QPen m_pen;
};

QWDialogPen类的getPen()以及相关函数的实现代码如下:

void QWDialogPen::setPen(QPen pen)
{m_pen = pen;ui->spinWidth->setValue(pen.width());int i = static_cast<int>(pen.style());ui->comboPenStyle->setCurrentIndex(i);QColor color = pen.color();ui->btnColor->setAutoFillBackground(true);QString str = QString::asprintf("background-color: rgb(%d,%d,%d);", color.red(), color.green(), color.blue());ui->btnColor->setStyleSheet(str);
}QPen QWDialogPen::getPen()
{m_pen.setStyle(Qt::PenStyle(ui->comboPenStyle->currentIndex()));m_pen.setWidth(ui->spinWidth->value());QColor color = ui->btnColor->palette().color(QPalette::Button);m_pen.setColor(color);return m_pen;
}QPen QWDialogPen::getPen(QPen iniPen, bool &ok)
{QWDialogPen* dlg = new QWDialogPen();dlg->setPen(iniPen);QPen pen;int ret = dlg->exec(); // 弹出对话框if (ret == QDialog::Accepted) {pen = dlg->getPen(); // 获取ok = true;}else {pen = iniPen;ok = false;}delete dlg; // 删除对话框对象return pen; //返回设置的QPen对象
}

静态函数getPen()里创建了一个QWDialogPen类的实例dlg,然后调用dlg→setPen(iniPen)进行初始化,运行对话框并获取返回值,若返回值为QDialog::Accepted,就调用dlg→getPen()获取设置属性后的QPen对象,最后删除对话框对象并返回设置的Qpen对象。所以,静态函数getPen()就是集成了普通方法调用对话框时创建对话框,设置初始值、获取对话框返回状态、获取返回删除对话框的过程,简化了调用代码。

QChart设置

QChart类的主要函数

分组函数名功能描述
图表外观void setTitle()设置图表标题,支持HTML
void setTitleFont()设置图表标题字体
void setTitleBrush()设置比图表标题画刷
void setTheme()设置主题,定义了图表的配色
void setMargins()设置绘图区与图表边界的四个边距
QLegend* legend()返回图表的图例,是一个QLegend类对象
void setAnimationOptions()设置序列或坐标轴的动画效果
数据序列void addSeries()添加序列
QList<QAbstractSeries*>series()返回图表拥有的序列的列表
void removeSeries()移除一个序列,但并不删除序列对象
void removeAllSeries()移除并删除图表的所有序列
坐标轴void addAxis()为图表的某个方向添加坐标轴
QList<QAbstractSeries*> axes()返回某个方向的坐标轴列表
void setAxisX()设置某个序列的水平方向的坐标轴
void setAxisY()设置某个序列的垂直方向的坐标轴
void removeAxis()移除一个坐标轴
void createDefaultAxes()更具已添加的序列类型,创建缺省的坐标轴,前面已有的坐标轴会被删除

通过图表的设置界面可以设置标题的内容和字体,可以设置图例的位置,是否显示,字体颜色和边距;可以设置动画效果和主题。

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240825194552.png

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240825194609.png

setAnimationOptions(AnimationOptions options)函数设置图表的动画效果,输入参数是QChart::AnimationOption枚举类型,有以下取值:

  • QChart::NoAnimation:无动画效果;

  • QChart::GridAxisAnimations:背景网格有动画;

  • QChart::SeriesAnimations:序列有动画效果;

  • QChart::AllAnimations:都有动画效果。

主题是预定义的图表配色样式,是QChart::ChartTheme枚举类型,有多种取值。

图例是一个QLegend类对象,通过QChart::legend()可以获取图表的图例。图例是根据添加的序列自动生成的,但是可以修改一些属性,如:位置,文字和字体等。例如:

ui->chartView->chart()->legend()->setAlignment(Qt::AlignBottom);void MainWindows::on_btnLegendFont_clicked() {QFont font = ui->chartView->chart()->legend()->font();bool ok = false;font = QFontDialog::getFont(&ok, font);if (ok) {ui->chartView->chart()->legend()->setFont(font);}
}

这篇关于QChart绘制折线图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107912

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

HighCharts 折线图的实现

Java和HighCharts结合,实现折线图; 代码下载:Java和Highcharts实现折线图

使用matplotlib绘制散点图、柱状图和饼状图-学习篇

一、散点图 Python代码如下: num_points = 100x = np.random.rand(num_points) #x点位随机y = np.random.rand(num_points) #y点位随机colors = np.random.rand(num_points) #颜色随机sizes = 1000 * np.random.rand(num_points) # 大

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

Excel绘制CDF图

对如下20个原始数据绘制cdf图 1. 对数据进行排序,从小到大 2. 计算累积分布: 计算公式为: 然后对C3下拉,得到累积分布数据。 3. 选中B、C两列绘制散点图:

【python 图像绘制】图像绘制知识总结

颜色图谱 具体颜色描述autumn 红橙黄cool 青-洋红copper 黑-铜flag 红-白-蓝-黑gray 黑-白hot 黑-红-黄-白hsv hsv颜色空间, 红-黄-绿-青-蓝-洋红-红inferno 黑-红-黄jet 蓝-青-黄-红magma 黑-红-白pink 黑-粉-白plasma 绿-红-黄prism 红-黄-

【python 相关性分析】Python绘制相关性热力图

在数据分析时,经常会针对两个变量进行相关性分析。在Python中主要用到的方法是pandas中的corr()方法。 corr():如果由数据框调用corr函数,那么将会计算每个列两两之间的相似度,返回DataFrame # -*- coding: utf-8 -*-# 导入包import pandas as pdimport numpy as npimport matplotlib.py