硬件: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中之前已有的曲线和坐标轴,否则会出现多个坐标轴和曲线的情况,如下: