找回密码
 立即注册
收起左侧

串口获取温度,绘制温度曲线!

3
回复
5772
查看
[复制链接]
累计签到:5 天
连续签到:1 天
来源: 2014-11-4 21:11:37 显示全部楼层 |阅读模式
本帖最后由 扼魔Maycry 于 2014-11-4 21:11 编辑


如图所示,这是一个上位机程序,主要显示传感器获取的温度值,并将其实时绘制成曲线图,目前问题就是绘制的曲线在刷新到一定时间后,会越界窗体,用的是QPainterPath 方法,现在想用图形视图框架完善,但小辈不才,请大家多多指教,绘制部分源码会在下面贴出,谢谢大家的帮助!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
参与人数 1人气 +1 收起 理由
KIRA-PAN + 1 很实用!

查看全部评分总评分 : 人气 +1

回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2014-11-4 21:11:38 显示全部楼层
  1. #include "tempshow_1.h"
  2. #include "ui_tempshow_1.h"
  3. #include <QDebug>
  4. #include <QMessageBox>

  5. TempShow_1::TempShow_1(QWidget *parent) :
  6.     QDialog(parent),
  7.     ui(new Ui::TempShow_1)
  8. {
  9.     ui->setupUi(this);
  10.     setWindowTitle(tr("温度显示_1"));

  11.     //绘图部分
  12.     t = 0;
  13.     p = 200;
  14.     Point.setX(200);  /* 初始化起始点的纵坐标为0 */
  15.     Point.setY(220);  /* 初始化起始点的横坐标为0 */
  16.     path = new QPainterPath;
  17.     timer = new QTimer(this);
  18.     connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));
  19.     startPainting();
  20. }

  21. TempShow_1::~TempShow_1()
  22. {
  23.     delete ui;
  24. }

  25. void TempShow_1::setValues(QString Test)
  26. {
  27.     Temp_int = Test;
  28.     ui->tempLabel->setText(Temp_int);
  29. }

  30. void TempShow_1::timerUpDate()
  31. {
  32.     Saber = ui->tempLabel->text().toInt();
  33.     qDebug()<<Saber;
  34.     t += 10;
  35.     Point.setX(t);       /* 时间加二秒 */
  36.     if(Saber < 40 && Saber != 0){
  37.         if(Saber == 20)
  38.             Point.setY(0);          // 设置温度下限20℃
  39.         else if(Saber == 21)
  40.             Point.setY(-30);      // 绘制温度21℃
  41.         else if(Saber == 22)
  42.             Point.setY(-60);      // 绘制温度22℃
  43.         else if(Saber == 23)
  44.             Point.setY(-90);      // 绘制温度23℃
  45.         else if(Saber == 24)
  46.             Point.setY(-120);      // 绘制温度24℃
  47.         else if(Saber == 25)
  48.             Point.setY(-150);      // 绘制温度25℃
  49.         else if(Saber == 26)
  50.             Point.setY(-180);      // 绘制温度26℃
  51.         else if(Saber == 27)
  52.             Point.setY(-210);      // 绘制温度27℃
  53.         else if(Saber == 28)
  54.             Point.setY(-240);      // 绘制温度28℃
  55.         else if(Saber == 29)
  56.             Point.setY(-270);    // 绘制温度29℃
  57.         else if(Saber == 30)
  58.             Point.setY(-300);    // 绘制温度30℃
  59.         else if(Saber == 31)
  60.             Point.setY(-330);    // 绘制温度31℃
  61.         else if(Saber == 32)
  62.             Point.setY(-360);    // 绘制温度31℃
  63.         else if(Saber == 33)
  64.             Point.setY(-390);    // 绘制温度31℃
  65.         else{
  66.             Point.setY(-420);    // 过滤超标温度值!
  67.             QMessageBox msgBox;
  68.             msgBox.setText("The Temp has been outnumber the definition !");
  69.             msgBox.exec();
  70.         }
  71.         qDebug()<<Saber;
  72.         path->lineTo(Point);    /*绘点连线*/
  73.     }

  74.     /*int groupBoxWidth = ui->groupBox_3->width();
  75.     if(t > groupBoxWidth){
  76.         // when the Time t more than groupBoxWidth,readjust the DrawArea
  77.         p = p - 10;     //调整坐标原点
  78.         if(p == 190)
  79.             p = 200;
  80.     }*/
  81.     update();
  82. }

  83. void TempShow_1::startPainting(void)
  84. {
  85.     timer->start(1000);
  86. }

  87. void TempShow_1::closePainting(void)
  88. {
  89.     timer->stop();
  90. }

  91. void TempShow_1::paintEvent(QPaintEvent *)
  92. {
  93.     QPainter painter(this);
  94.     painter.setRenderHint(QPainter::Antialiasing, true);
  95.     QPen thickPen(palette().foreground(), 2.0);        // 设置大刻度线画笔为粗黑!
  96.     QPen thinPen(palette().foreground(), 1.0);          // 设置小刻度线画笔为细黑!
  97.     painter.translate(40,430);                                     // 调整坐标原点

  98.     int width_X = 560.0;
  99.     int higth_Y = 420;

  100.     QLineF line_X(0.0, 0.0, width_X, 0.0);
  101.     painter.drawLine(line_X);                           // 绘制X轴
  102.     QLineF line_Y(0.0, 0.0, 0.0, -higth_Y);
  103.     painter.drawLine(line_Y);                           // 绘制X轴

  104.     painter.setPen(QPen(Qt::red, 2)); // 设置画笔颜色和大小
  105.     painter.drawPath(*path);               // 绘制路径

  106.     /*画刻度还有数字*/
  107.     for(int i = 1; i < higth_Y; i++){
  108.         if(i % 30 == 0){
  109.             painter.setPen(thickPen);
  110.             QLineF lineThick(0.0, -(0.0 + i), 5.0, -(0.0 + i));
  111.             painter.drawLine(lineThick);
  112.         }

  113.         if(i % 6 == 0) {
  114.             painter.setPen(thinPen);
  115.             QLineF lineThin(0.0, -(0.0 + i), 2.0, -(0.0 + i));
  116.             painter.drawLine(lineThin);
  117.         }
  118.     }
  119. }
复制代码
回复 支持 反对

使用道具 举报

累计签到:5 天
连续签到:1 天
2014-11-4 22:35:48 显示全部楼层
现在正在使用QCustomPlot优化!
回复 支持 反对

使用道具 举报

累计签到:11 天
连续签到:1 天
2016-3-28 21:10:37 显示全部楼层
扼魔Maycry 发表于 2014-11-4 22:35
现在正在使用QCustomPlot优化!

能分享完整的例子么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了