需求分析:
1.建立三个坐标系,分别表示温度(T/°C),电压(V/mV),时间(t/s)的两两对应关系。
2.建立一个点服务,每0.3秒给一个点,将点画在坐标系上。
时序图如下:
制作出来的最终效果图如下:
首先需要画好坐标系。如图所示就是我一开始画好的坐标系。
不过这有一个问题,就是三个坐标系都是放在了一张画布上,如果再想增加坐标系,需要改动的地方很多,甚至要改动原有的代码,所以我做了一些改动,直接创建三块画布,每块画布上画一个坐标系。
这样每次创建新的坐标系,只需要再添加一块画布,然后把坐标系在画布里画一下就行了
之后需要的就是创建一个点,然后把它画出来了。
由于这次的坐标系一共有三个参数:温度,电压和时间,所以我们需要点服务(pointService)每次给我们的数据同时有这三个属性,然后我们再把它拆分成三个坐标系的point属性
定义好了点之后,就可以写点服务了。
在这之后,只需要点击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);
}
}
画点的代码
不足之处:
这样虽然实现了画点的方法,但是数据的处理全都放在了点击事件里面,这个画点的方法有点多此一举,感觉直接在点击事件里面直接画比这样还省事。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。