qt使用对数坐标的例子,qchart用QLogValueAxis坐标不出图解决

embedded/2024/9/21 8:01:03/

硬件:ThinkPad T15

系统:win10 专业版

qt版本:Qt 5.14.1   , QtCreator 4.11.1

软件界面放了一个QPushButton,一个QVBoxLayout,如下:

主要代码如下,我添加了两条曲线,分别是series和series2,每条曲线1000个点,第一条曲线y值随x线性增加,第二条曲线y值获取的是0到1000以内的随机值,然后纵坐标用的对数坐标,范围是0.1到1000:

chart = new QChart();chart->setTitle("强度变化曲线");chart->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);chartView = new QChartView(this);chartView->setChart(chart);chartView->setRubberBand(QChartView::RectangleRubberBand);ui->verticalLayout->addWidget(chartView);
//使用对数坐标QLogValueAxis *logAxisY =new QLogValueAxis();logAxisY->setRange(0.1,1000);logAxisY->setLabelFormat("%.2f");// 设置纵坐标的标签格式logAxisY->setTitleText("y坐标");logAxisY->setMinorTickCount(5);//设置刻度间隔间的子间隔QValueAxis *axisX = new QValueAxis();axisX->setTitleText("x坐标");axisX->setRange(0, 100);chart->addAxis(logAxisY,Qt::AlignLeading);chart->addAxis(axisX,Qt::AlignBottom);QLineSeries *series = new QLineSeries(chart);//初始化一条折线QLineSeries *series2 = new QLineSeries(chart);//初始化一条折线for(int j = 1;j<=1000;j++){series->append(j*1.0f/10,j);//第一条曲线的y值线性增长double y = QRandomGenerator::global()->bounded(1000);if(y<=0)qDebug()<<y;y = y<=0?0.1:y;//因为对数曲线不能处理负数和0,所以要剔除异常值,否则曲线无法显示series2->append(j*1.0f/10,y);//第二条曲线的y值随机1000以内的值}chart->addSeries(series);//曲线添加到chart类中series->attachAxis(logAxisY);//曲线绑定y坐标(对数坐标)series->attachAxis(axisX);//曲线绑定x坐标(普通坐标)chart->addSeries(series2);//曲线添加到chart类中series2->attachAxis(logAxisY);//曲线绑定y坐标(对数坐标)series2->attachAxis(axisX);//曲线绑定x坐标(普通坐标)

运行效果如下,蓝色的是y随x线性增加的曲线,绿色的是y值取随机值的曲线:

正常的代码逻辑是:1.初始化QChart,2.初始化QChartView,并通过QChartView::setChart(QChart *chart)来设置QChart,3.初始化QLogValueAxis作为纵坐标并设置坐标轴范围,初始化QValueAxis作为横坐标并设置坐标轴范围,4.通过QChart::addAxis(QAbstractAxis *axis, Qt::Alignment alignment)将2个坐标轴添加到QChart中,5.初始化曲线QLineSeries,并将数据塞进曲线中,6.通过QChart::addSeries(QAbstractSeries *series)将曲线放进QChart中,7.通过QAbstractSeries::attachAxis(QAbstractAxis *axis)将曲线和坐标轴绑定。然后就能正常显示了。

有几个问题要注意:

问题一:如果没有将曲线绑定到对数坐标,那么显示出来的曲线是按照线性y坐标显示的,如下图:

问题二:曲线中的y值出现了<=0的值,则该条曲线就不能显示,如下图,第二条曲线中出现了0值,所以直接不显示了,只显示不含0值的第一条曲线:

问题三:每次重新显示曲线前,要清空QChart中之前已有的曲线和坐标轴,否则会出现多个坐标轴和曲线的情况,如下:

 


http://www.ppmy.cn/embedded/114508.html

相关文章

【STM32 Blue Pill编程实例】-手机通过HC-05串口蓝牙控制LED

手机通过HC-05串口蓝牙控制LED 文章目录 手机通过HC-05串口蓝牙控制LED1、HC-05串口蓝牙模块介绍2、硬件准备和接线3、模块配置4、代码实现5、手机控制在本文中,我们介绍如何使用 STM32CubeIDE 和 HAL 库将 HC-05 蓝牙模块与 STM32 Blue Pill 开发板连接。 我们将使用 Android…

Scrapy爬虫框架 Pipeline 数据传输管道

在网络数据采集领域&#xff0c;Scrapy 是一个非常强大的框架&#xff0c;而 Pipeline 是其中不可或缺的一部分。它允许我们在数据处理的最后阶段对抓取的数据进行进一步的处理&#xff0c;如清洗、存储等操作。 本教程将详细介绍如何在 Scrapy 中使用 Pipeline&#xff0c;帮…

neo4j节点关联路径的表示、节点的增删改查

目录 核心概念节点的增删改查&#xff08;1&#xff09;增&#xff08;2&#xff09;查&#xff08;3&#xff09;删&#xff08;4&#xff09;改 neo4j文档&#xff1a;https://neo4j.com/docs/ https://neo4j.com/docs/cypher-manual/current/introduction/ 核心概念 节点 ne…

交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面

一、介绍 交通标志识别系统。本系统使用Python作为主要编程语言&#xff0c;在交通标志图像识别功能实现中&#xff0c;基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对收集到的58种常见的交通标志图像作为数据集&#xff0c;进行迭代训练最后得到一个识别精度较高…

[Mdp] lc3290. 最高乘法得分(二维dp+状态定义+状态转移+LCS问题+好题+周赛415_2)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;3290. 最高乘法得分 类似&#xff1a; [Mdp] lc3259. 超级饮料的最大强化能量(dp状态表示状态转移状态机dp周赛411_2) 2. 题目解析 挺不错的题目&#xff0c;纠结了一会贪心解法&#xff0c;但是没有什么卵用…

cpp中的namespace详解

namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性&#xff0c;它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说&#xff0c;它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…

音频北斗定位系统有什么用?

在当今科技飞速发展的时代&#xff0c;定位技术已经成为我们日常生活和各行各业不可或缺的一部分。其中&#xff0c;音频北斗定位系统作为一种新兴的定位技术&#xff0c;正逐渐展现出其独特的优势和应用价值。那么&#xff0c;到底音频北斗定位系统有什么用呢?我们一起来了解…

Webpack 和 Vite 的区别

Webpack 是一种模块打包工具&#xff0c;主要功能是将各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;通过 loader 和 plugin 转换和打包成可以直接在浏览器中运行的代码。其核心思想是以代码分割、按需加载和优化资源来提升性能。 Vite 是一种新型构建工具&…