需求分析:
1.創建三個座標系,分別表示溫度(T/°C),電壓(V/mV),時間(t/s)的兩兩對應關係。
2.創建一個點服務,每0.3秒給一個點,將點畫在座標系上。this
時序圖以下:
spa
製做出來的最終效果圖以下:code
首先須要畫好座標系。如圖所示就是我一開始畫好的座標系。blog
不過這有一個問題,就是三個座標系都是放在了一張畫布上,若是再想增長座標系,須要改動的地方不少,甚至要改動原有的代碼,因此我作了一些改動,直接建立三塊畫布,每塊畫布上畫一個座標系。事件
這樣每次建立新的座標系,只須要再添加一塊畫布,而後把座標系在畫布裏畫一下就好了ip
以後須要的就是建立一個點,而後把它畫出來了。
因爲此次的座標系一共有三個參數:溫度,電壓和時間,因此咱們須要點服務(pointService)每次給咱們的數據同時有這三個屬性,而後咱們再把它拆分紅三個座標系的point屬性get
定義好了點以後,就能夠寫點服務了。it
在這以後,只須要點擊start按鈕的時候達成如下條件,就能夠了
1.獲取到點服務傳過來的數據,並將數據拆分
2.將拆分後的數據乘以比例係數變成座標系的point(x,y)數據
3.畫點
點擊事件的代碼:class
void MainWindow::on_pushButton_clicked()
{cli
// 用於接收傳過來的點 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); }
}
畫點的代碼
不足之處:這樣雖然實現了畫點的方法,可是數據的處理全都放在了點擊事件裏面,這個畫點的方法有點畫蛇添足,感受直接在點擊事件裏面直接畫比這樣還省事。