老早就做了功能,在做第二次的时候发现还是将其记录下来,以免日后时间过长遗忘了
一、在项目的.pro添加的是
QT += charts
并且在程序的开头(不是.pro文件)加上一句 using namespace Qtcharts或者一个宏 QT_CHARTS_USE_NAMESPACE
二、界面如图所示

因为这只是一个demo,没有与其他地方通讯,所以就固定显示,如果你们以后有需求,只需要返回需要显示的数据即可
三、

其中
1 void MainWindow::SeriesInit(qint8 ch) 2
3 { 4 //新建一条折现线
5
6 m_series[ch] = new QLineSeries; 7
8 //添加到chart
9
10 m_chart->addSeries(m_series[ch]); 11
12 switch(ch) 13
14 { 15 //设置颜色和线大小
16
17 case 0:m_series[ch]->setPen(QPen(Qt::black,2,Qt::SolidLine));break; 18
19 case 1:m_series[ch]->setPen(QPen(Qt::red,2,Qt::SolidLine));break; 20
21 case 2:m_series[ch]->setPen(QPen(Qt::green,2,Qt::SolidLine));break; 22
23 case 3:m_series[ch]->setPen(QPen(Qt::blue,2,Qt::SolidLine));break; 24
25 case 4:m_series[ch]->setPen(QPen(Qt::cyan,2,Qt::SolidLine));break; 26
27 case 5:m_series[ch]->setPen(QPen(Qt::magenta,2,Qt::SolidLine));break; 28
29 case 6:m_series[ch]->setPen(QPen(Qt::yellow,2,Qt::SolidLine));break; 30
31 case 7:m_series[ch]->setPen(QPen(Qt::gray,2,Qt::SolidLine));break; 32
33 } 34
35 //将其添加到坐标轴
36
37 m_chart->setAxisX(axisX,m_series[ch]); 38
39 m_chart->setAxisY(axisY,m_series[ch]); 40
41 //关联显示函数
42
43 connect(m_series[ch], SIGNAL(hovered(QPointF, bool)), this, SLOT(showPointData(QPointF,bool))); 44
45 } 46
47 放大缩小,一个鼠标滚轮事件: 48
49 void MainWidget::wheelEvent(QWheelEvent *event) 50 { 51 if (event->delta() > 0) { 52 chart->zoom(1.1); 53 } else { 54 chart->zoom(10.0/11); 55 } 56
57 QWidget::wheelEvent(event); 58 } 59
60 其实就调用了一个zoomReset()函数: 61
62 void ChartView::mousePressEvent(QMouseEvent *event) 63 { 64 if (event->button() & Qt::LeftButton) { 65 isClicking = true; 66 } else if (event->button() & Qt::RightButton) { 67 chart()->zoomReset(); 68 } 69
70 QChartView::mousePressEvent(event); 71 } 72
73 图像拖拽 74 就是一个mousePressEvent和mouseMoveEvent事件,鼠标按下了把标志位变为true,然后在鼠标Move的时候检测标志位是否为true,如果是就根据坐标计算scroll值: 75
76 void ChartView::mouseMoveEvent(QMouseEvent *event) 77 { 78 int x, y; 79
80 if (isClicking) { 81 if (xOld == 0 && yOld == 0) { 82 } else { 83 x = event->x() - xOld; 84 y = event->y() - yOld; 85 chart()->scroll(-x, y); 86 } 87
88 xOld = event->x(); 89 yOld = event->y(); 90
91 return; 92 } 93
94 QChartView::mouseMoveEvent(event); 95 } 96
97 但是如果先拖拽再放大缩小,还原的时候是已拖拽的地方为初始位置,故在没有放大缩小的时候不准拖拽 98
99 int x, y; 100 if (isClicking) { 101 if (xOld == 0 && yOld == 0) { } 102
103 else{ 104 if(isZooninOrOut){ 105 x = event->x() - xOld; 106
107 y = event->y() - yOld; 108
109 chart()->scroll(-x, y);} 110
111 } 112
113 xOld = event->x(); 114
115 yOld = event->y(); 116
117 return; 118
119 }QChartView::mouseMoveEvent(event); 120
121
122 void MainWindow::updateData() 123 { 124 int i,j; 125 QVector<QPointF> oldData[8]; 126 QVector<QPointF> data[8]; 127 qint64 size[8]; 128 if(isVisible()) 129 { 130 if(currentChangel == 8) 131 { 132 for(j = 0;j < 8;j++) 133 { 134 oldData[j] = m_series[j]->pointsVector(); 135 if (oldData[j].size() < 100) 136 { 137 data[j] = oldData[j]; 138 } 139 else
140 { 141 /* 添加之前老的数据到新的vector中,不复制最前的数据,即每次替换前面的数据 142 * 由于这里每次只添加1个数据,所以为1,使用时根据实际情况修改 143 */
144
145 for (i = 1; i < oldData[j].size(); ++i) { 146 data[j].append(QPointF(i - 1, oldData[j].at(i).y())); 147 } 148
149 } 150 size[j] = data[j].size(); 151 } 152 /* 这里表示插入新的数据,因为每次只插入1个,这里为i < 1, 153 * 但为了后面方便插入多个数据,先这样写 154 */
155
156 for(i = 0; i < 1; ++i){ 157 for(j = 0;j < 8;j++) 158 { 159 data[j].append(QPointF(i + size[j], GetTempData(j) )); 160 } 161 } 162 for(j = 0;j < 8;j++) 163 { 164 m_series[j]->replace(data[j]); 165 } 166 } 167 else
168 { 169 lastChangel =currentChangel; 170 oldData[currentChangel] = m_series[currentChangel]->pointsVector(); 171 if (oldData[currentChangel].size() < 100) 172 { 173 data[currentChangel] = oldData[currentChangel]; 174 } 175 else
176 { 177 for (i = 1; i < oldData[currentChangel].size(); ++i) { 178 data[currentChangel].append(QPointF(i - 1, oldData[currentChangel].at(i).y())); 179 } 180
181 } 182 size[currentChangel] = data[currentChangel].size(); 183 for(i = 0; i < 1; ++i) 184 { 185 data[currentChangel].append(QPointF(i + size[currentChangel], GetTempData(currentChangel) )); 186 } 187 m_series[currentChangel]->replace(data[currentChangel]); 188 } 189 } 190
191 } 192
193 暂停/继续 194
195 if (QObject::sender() == ui->Btn_Stop) { 196 if (!isStopping) { 197 TempTime->stop(); 198
199 ui->Btn_Stop->setText("继续"); 200
201 } else { 202 TempTime->start(); 203
204 ui->Btn_Stop->setText("暂停"); 205
206 } 207
208 isStopping = !isStopping; } 209
210 这里要添加一句:在下载的代码里,切换通道的方法我觉得不好了,其实在切换通道,界面显示的是可以清空的,不用移除, 211
212 if(lastChangel ==8) 213
214 { 215 for(qint8 i = 0;i <8;i++) 216
217 { 218 //上一个显示了8个通道,那么就要所有的都清空
219
220 m_series[i]->clear(); 221
222 } 223
224 } 225
226 else
227
228 { 229 //不然只需清空上一个通道的线
230
231 m_series[lastChangel]->clear(); 232
233 }
主要功能就是:8条通道显示,保存当前曲线,通道切换,暂停/继续,区间变换,数据动态更新,放大缩小,比例复原,坐标显示,图像拖拽
