现在的位置: 首页 > 综合 > 正文

qt折线图显示数据

2018年07月14日 ⁄ 综合 ⁄ 共 5272字 ⁄ 字号 评论关闭
  1. 转载:http://blog.csdn.net/zhx6044/article/details/8030249
  2. /************************************************* 
  3.  
  4. 折线图绘制 
  5.  
  6. author 周翔 
  7.  
  8. 2012-8-14 
  9.  
  10. *************************************************/  
  11.   
  12. #ifndef LINEGRAPHWIDGET_H  
  13.   
  14. #define LINEGRAPHWIDGET_H  
  15.   
  16. #include <QWidget>  
  17.   
  18. #include <QPen>  
  19.   
  20. #include <QPainter>  
  21.   
  22. #include <QResizeEvent>  
  23.   
  24. //#include <QDebug>  
  25.   
  26. #include <QTimer>  
  27.   
  28. struct point  
  29.   
  30. {  
  31.   
  32. int x;  
  33.   
  34. int y;  
  35.   
  36. };  
  37.   
  38. class LineGraphWidget : public QWidget  
  39.   
  40. {  
  41.   
  42. Q_OBJECT  
  43.   
  44. public:  
  45.   
  46. //mix和max为折线的y轴的数据范围  
  47.   
  48. explicit LineGraphWidget(int mix, int max,QWidget *parent = 0);  
  49.   
  50. void setSingleUnitX(const int &value) {singleUnitX = value;}//设置x轴的一个单位占多少个像素,默认10  
  51.   
  52. //支持定时器定时更新  
  53.   
  54. void startUpdataTimer(int msecond);  
  55.   
  56. void stopUpdataTimer();  
  57.   
  58. signals:  
  59.   
  60. //支持实时更新  
  61.   
  62. void newDataCome();//有新数据到来时发出的折线图更新信号  
  63.   
  64. public slots:  
  65.   
  66. void showData(const int &data);//接受来之外部的数据  
  67.   
  68. protected:  
  69.   
  70. void paintEvent(QPaintEvent *);  
  71.   
  72. void resizeEvent(QResizeEvent *e);  
  73.   
  74. private:  
  75.   
  76. QList<int> xList;  
  77.   
  78. QList<int> yList;  
  79.   
  80. int Counter;  
  81.   
  82. //窗口的长和宽  
  83.   
  84. int widgetX;  
  85.   
  86. int widgetY;  
  87.   
  88. //折线图的显示范围  
  89.   
  90. int rangeMin;  
  91.   
  92. int rangeMax;  
  93.   
  94. //根据窗口和范围得出的单位长,x轴,y轴  
  95.   
  96. int singleUnitX;  
  97.   
  98. int singleUnitY;  
  99.   
  100. //根据窗口得出的多少个单位,x轴,y轴  
  101.   
  102. int sumUnitX;  
  103.   
  104. int sumUnitY;  
  105.   
  106. point basePoint;//折线图的原点  
  107.   
  108. point xAxisEndPoint;//X轴的终点  
  109.   
  110. point yAxisEndPoint;//Y轴的终点  
  111.   
  112. QTimer *timer;  
  113.   
  114. void getSumUnitX();  
  115.   
  116. void getSingleUnitY();  
  117.   
  118. void initGraph();  
  119.   
  120. };  
  121.   
  122. #endif // LINEGRAPHWIDGET_H  
  123.   
  124. #include "linegraphwidget.h"  
  125.   
  126. LineGraphWidget::LineGraphWidget(int mix, int max, QWidget *parent) :  
  127.   
  128. QWidget(parent),  
  129.   
  130. rangeMin(mix),  
  131.   
  132. rangeMax(max),  
  133.   
  134. singleUnitX(10),  
  135.   
  136. timer(NULL)  
  137.   
  138. {  
  139.   
  140. connect(this,SIGNAL(newDataCome()),this,SLOT(update()));  
  141.   
  142. }  
  143.   
  144. void LineGraphWidget::paintEvent(QPaintEvent *)  
  145.   
  146. {  
  147.   
  148. int i;  
  149.   
  150. int a,b,c,d;  
  151.   
  152. Counter = 0;  
  153.   
  154. QPixmap pix(widgetX,widgetY);  
  155.   
  156. QPainter painter(&pix);  
  157.   
  158. pix.fill(Qt::white);  
  159.   
  160. QPen pen;  
  161.   
  162. pen.setBrush(Qt::darkGreen);  
  163.   
  164. painter.setPen(pen);  
  165.   
  166. QPen pen1;  
  167.   
  168. pen1.setBrush(Qt::black);  
  169.   
  170. painter.setRenderHint(QPainter::Antialiasing);  
  171.   
  172. for(i = 0;i < sumUnitX; ++i) {  
  173.   
  174. a = basePoint.x + i*singleUnitX;  
  175.   
  176. b = basePoint.y;  
  177.   
  178. c= a;  
  179.   
  180. d = yAxisEndPoint.y;  
  181.   
  182. painter.drawLine(a,b,c,d);  
  183.   
  184. }  
  185.   
  186. for(i = 0; i < sumUnitY+1; ++i) {  
  187.   
  188. a = basePoint.x;  
  189.   
  190. b = basePoint.y - singleUnitY*i;  
  191.   
  192. c = xAxisEndPoint.x;  
  193.   
  194. d = b;  
  195.   
  196. painter.drawLine(a,b,c,d);  
  197.   
  198. }  
  199.   
  200. painter.setPen(pen1);  
  201.   
  202. for (i = 0;i < (sumUnitY/2+1);++i) {  
  203.   
  204. QRectF rectF(0,basePoint.y - singleUnitY*i*2 - 5,basePoint.x,(widgetY - basePoint.y)/3);  
  205.   
  206. painter.drawText(rectF,Qt::AlignCenter,QString::number(rangeMin+i*20));  
  207.   
  208. }  
  209.   
  210. for (i = 0;i < sumUnitX/5;++i) {  
  211.   
  212. QRectF rectF(basePoint.x+singleUnitX*(5*i+3),basePoint.y,singleUnitX*4,widgetY-basePoint.y);  
  213.   
  214. painter.drawText(rectF,Qt::AlignCenter,QString::number(5*(i+1)*singleUnitX));  
  215.   
  216. }  
  217.   
  218. int size = xList.size();  
  219.   
  220. while(Counter < (size -1)) {  
  221.   
  222. painter.drawLine(basePoint.x + xList.value(Counter)*singleUnitX,  
  223.   
  224. basePoint.y - ((yList.value(Counter) - rangeMin)/10.0)*singleUnitY,  
  225.   
  226. basePoint.x + xList.value(Counter + 1)*singleUnitX,  
  227.   
  228. basePoint.y - ((yList.value(Counter + 1) - rangeMin)/10.0)*singleUnitY);  
  229.   
  230. Counter++;  
  231.   
  232. }  
  233.   
  234. painter.end();  
  235.   
  236. painter.begin(this);  
  237.   
  238. painter.drawPixmap(0,0,pix);  
  239.   
  240. painter.end();  
  241.   
  242. Counter = 0;  
  243.   
  244. }  
  245.   
  246. void LineGraphWidget::resizeEvent(QResizeEvent * e)  
  247.   
  248. {  
  249.   
  250. if (e->oldSize() != size()) {  
  251.   
  252. initGraph();  
  253.   
  254. }  
  255.   
  256. }  
  257.   
  258. void LineGraphWidget::showData(const int &data)  
  259.   
  260. {  
  261.   
  262. //这里还要进行相关的数据正确性检测,不能超过图的范围  
  263.   
  264. if (data > rangeMax || data < rangeMin) {  
  265.   
  266. return;  
  267.   
  268. }  
  269.   
  270. int xsize = xList.size();  
  271.   
  272. int yValue = data;  
  273.   
  274. if (xsize == sumUnitX) {  
  275.   
  276. xList.clear();  
  277.   
  278. yList.clear();  
  279.   
  280. xsize = xList.length();  
  281.   
  282. }  
  283.   
  284. if (xsize >= 1) {  
  285.   
  286. xList.insert(xsize,xsize);  
  287.   
  288. yList.insert(xsize,yValue);  
  289.   
  290. emit newDataCome();  
  291.   
  292. }  
  293.   
  294. else {  
  295.   
  296. xList.insert(xsize,xsize);  
  297.   
  298. yList.insert(xsize,yValue);  
  299.   
  300. }  
  301.   
  302. }  
  303.   
  304. void LineGraphWidget::getSumUnitX()  
  305.   
  306. {  
  307.   
  308. if ((static_cast<int>(widgetX*0.85))%singleUnitX == 0){  
  309.   
  310. sumUnitX = (static_cast<int>(widgetX*0.85))/singleUnitX;  
  311.   
  312. }  
  313.   
  314. else {  
  315.   
  316. sumUnitX = (static_cast<int>(widgetX*0.85))/singleUnitX + 1;  
  317.   
  318. }  
  319.   
  320. }  
  321.   
  322. void LineGraphWidget::getSingleUnitY()  
  323.   
  324. {  
  325.   
  326. int range = rangeMax - rangeMin;  
  327.   
  328. if (range == 0) {  
  329.   
  330. sumUnitY = range/10 + 1;  
  331.   
  332. }  
  333.   
  334. else {  
  335.   
  336. sumUnitY = range/10 + 2;  
  337.   
  338. }  
  339.   
  340. singleUnitY = (static_cast<int>(widgetY*0.85))/sumUnitY;  
  341.   
  342. }  
  343.   
  344. void LineGraphWidget::initGraph()  
  345.   
  346. {  
  347.   
  348. widgetX = size().width();  
  349.   
  350. widgetY = size().height();  
  351.   
  352. basePoint.x = static_cast<int>(widgetX*0.1);  
  353.   
  354. basePoint.y = static_cast<int>(widgetY*0.9);  
  355.   
  356. yAxisEndPoint.x = basePoint.x;  
  357.   
  358. yAxisEndPoint.y = static_cast<int>(widgetY*0.05);  
  359.   
  360. xAxisEndPoint.x = static_cast<int>(widgetX*0.95);  
  361.   
  362. xAxisEndPoint.y = basePoint.y;  
  363.   
  364. getSumUnitX();  
  365.   
  366. getSingleUnitY();  
  367.   
  368. }  
  369.   
  370. void LineGraphWidget::startUpdataTimer(int msecond)  
  371.   
  372. {  
  373.   
  374. if (timer != NULL) {  
  375.   
  376. if (timer->isActive()) {  
  377.   
  378. timer->stop();  
  379.   
  380. }  
  381.   
  382. delete timer;  
  383.   
  384. }  
  385.   
  386. disconnect(SIGNAL(newDataCome()));  
  387.   
  388. timer = new QTimer;  
  389.   
  390. connect(timer,SIGNAL(timeout()),this,SLOT(update()));  
  391.   
  392. timer->start(msecond);  
  393.   
  394. }  
  395.   
  396. void LineGraphWidget::stopUpdataTimer()  
  397.   
  398. {  
  399.   
  400. if (timer == NULL) {  
  401.   
  402. }  
  403.   
  404. else {  
  405.   
  406. timer->stop();  
  407.   
  408. delete timer;  
  409.   
  410. }  
  411.   
  412. }

抱歉!评论已关闭.