需求分析:
1.建立三个坐标系,分别表示温度(T/°C),电压(V/mV),时间(t/s)的两两对应关系。
2.建立一个点服务,每0.3秒给一个点,将点画在坐标系上。

时序图如下:
clipboard.png

制作出来的最终效果图如下:

clipboard.png

首先需要画好坐标系。如图所示就是我一开始画好的坐标系。

clipboard.png

不过这有一个问题,就是三个坐标系都是放在了一张画布上,如果再想增加坐标系,需要改动的地方很多,甚至要改动原有的代码,所以我做了一些改动,直接创建三块画布,每块画布上画一个坐标系。

clipboard.png

这样每次创建新的坐标系,只需要再添加一块画布,然后把坐标系在画布里画一下就行了

clipboard.png
clipboard.png

之后需要的就是创建一个点,然后把它画出来了。
由于这次的坐标系一共有三个参数:温度,电压和时间,所以我们需要点服务(pointService)每次给我们的数据同时有这三个属性,然后我们再把它拆分成三个坐标系的point属性

clipboard.png

定义好了点之后,就可以写点服务了。

clipboard.png

在这之后,只需要点击start按钮的时候达成以下条件,就可以了
1.获取到点服务传过来的数据,并将数据拆分
2.将拆分后的数据乘以比例系数变成坐标系的point(x,y)数据
3.画点
点击事件的代码:

void MainWindow::on_pushButton_clicked()
{

// 用于接收传过来的点
Point poi;
// 拆分之后的三个坐标系点
QPointF pointTop,pointLeft,pointRight;
PointService *poiSer = new PointService;
for (int i=0; i<100 ; i++){
    poi = poiSer->getOnePoint();
    // 将原点的X,Y再加上传过来的点乘以比例,构成新的点,然后调用drawPoint方法。
    // 比例系数:传过来的点×坐标轴实际长度/坐标轴最大刻度数。
    pointTop.setX(cooTop->getOriginPointX() + poi.getVol()
                  *cooTop->getRight()/cooTop->getScaleXmax());
    pointTop.setY(cooTop->getOriginPointY() - poi.getTem()
                  *cooTop->getTop()/cooTop->getScaleYmax());
    pointLeft.setX(cooleft->getOriginPointX() + poi.getTime()
                   *cooleft->getRight()/cooleft->getScaleXmax());
    pointLeft.setY(cooleft->getOriginPointY() - poi.getTem()
                   *cooleft->getTop()/cooleft->getScaleYmax());
    pointRight.setX(cooright->getOriginPointX() + poi.getTime()
                    *cooright->getRight()/cooright->getScaleXmax());
    pointRight.setY(cooright->getOriginPointY() - poi.getVol()
                    *cooright->getTop()/cooright->getScaleYmax());
    // 调用drawPoint方法,需要参数为一个点以及画布。
    cooTop->drawPoint(pointTop,&imagetop);
    cooleft->drawPoint(pointLeft,&imageleft);
    cooright->drawPoint(pointRight,&imageright);
    this->repaint();
    this->sleep(300);
}

}
画点的代码

clipboard.png

不足之处:
这样虽然实现了画点的方法,但是数据的处理全都放在了点击事件里面,这个画点的方法有点多此一举,感觉直接在点击事件里面直接画比这样还省事。


户瑞彤
46 声望8 粉丝

引用和评论

0 条评论