没有介绍,全是干货
private:
Ui_test *m_frm; //app窗口
QTimer dataTimer; //定时器
private slots:
void realtimeDataSlot(); //刷新曲线x、y轴数据的槽函数
private:
void init_curve(); //初始化曲线的一些属性
void CTest::init_curve() //初始化的时候做,建议只做一次,如果重复做,需要提前清空曲线的一些属性,不然会导致图例越来越多,轴重复等问题
{
m_frm->my_curve->addGraph(); //增加一条曲线,从graph(0)开始
m_frm->my_curve->graph(0)->setPen(QPen(Qt::blue)); //曲线线条颜色蓝色
m_frm->my_curve->graph(0)->setName("曲线一");
m_frm->my_curve->graph(0)->rescaleValueAxis(true, true);//y的极大值显示出来,此时y的极大值在最大范围处,顶到曲线最上方
m_frm->my_curve->graph(0)->rescaleAxes(); //极大值调整向下l、
m_frm->my_curve->addGraph(); // red line
m_frm->my_curve->graph(1)->setPen(QPen(Qt::red));
m_frm->my_curve->graph(1)->setName("曲线二");
m_frm->my_curve->xAxis->setTickLabelType(QCPAxis::ltDateTime); //定义x轴的刻度为时间,既曲线类型为时间轴曲线
m_frm->my_curve->xAxis->setDateTimeFormat("hh:mm:ss"); //x轴时间刻度格式
m_frm->my_curve->xAxis->setAutoTickStep(false);
m_frm->my_curve->xAxis->setTickStep(36); //x轴每个刻度间隔36s
m_frm->my_curve->axisRect()->setupFullAxesBox();
connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot())); //定时器timeout连接实时曲线刷新
dataTimer.start(1); //定时器的timeout时间为1ms,及每1ms刷新一次曲线
m_frm->my_curve->legend->setVisible(true); //图例可见,既曲线一与曲线二的图例自动生成,位置也可以调整,后面说怎么调
};
void CTest::realtimeDataSlot() //实时更新曲线数据
{
//key的单位是秒
double key = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0;
/*这里的代码是为了给两条曲线塞数据*/
qsrand(QTime::currentTime().msec() + QTime::currentTime().second() * 10000);
//使用随机数产生两条曲线
double value0 = qrand() % 100;
double value1 = qrand() % 80;
m_frm->my_curve->graph(0)->addData(key, value0);//添加数据1到曲线1
m_frm->my_curve->graph(1)->addData(key, value1);//添加数据2到曲线2
//塞数据到这里为止
//删除720秒之前的数据。这里的8要和下面设置横坐标宽度的8配合起来
//才能起到想要的效果,可以调整这两个值,观察显示的效果。
m_frm->my_curve->graph(0)->removeDataBefore(key - 720);
m_frm->my_curve->graph(1)->removeDataBefore(key - 720);
//自动设定graph(1)曲线y轴的范围,如果不设定,有可能看不到图像,手动设定也行,怎么设很简单
m_frm->my_curve->graph(0)->rescaleValueAxis(true, true);
m_frm->my_curve->graph(0)->rescaleAxes();
m_frm->my_curve->graph(1)->rescaleValueAxis(true, true);
m_frm->my_curve->graph(1)->rescaleAxes();
//这里的8,是指横坐标时间宽度为720秒,这里多说两句,这里跟上面的720,就设置成一样的,能理解就自己理解,不能理解就照做。然后这里的720s为x轴整个宽度,配合上一段代码里的36,就会让x轴显示720/36=20个刻度。简单除法,自己看情况调整。
m_frm->my_curve->xAxis->setRange(key + 0.25, 720, Qt::AlignVCenter);//设定x轴的范围
m_frm->my_curve->replot(); //重画实现实时曲线刷新,照抄
}
当然要包含先将类提升为QCustomPlot,怎么提升百度吧,也不用赘述。
最后我放一张实战效果图吧
没错,确实是d5000系统上开发的。涉及到敏感名称打点马赛克不过分吧,先这样。