qt外部数据传入实现动态的折线图绘制

53 篇文章 36 订阅

               在嵌入式开发中,实现数据收集与显示很常见,对于希望数据稳定的应用来说,
               折现图的表现形式很符合条件。
               本实现是通过qt的signal-slot来实现折线图的动态显示,一个信号的到来,数据添加,然后重绘
               
          这是其中使用到的一些数据结构

    QList<qreal> xList;//x轴数据链
    QList<qreal> yDrawList;//的y轴数据链
    QList<qreal> yWaList;//WA的y轴数据链
    QList<qreal> yWbList;//WB的x轴数据链
    int Counter;//记录3条折线的第几个点


    //我画了三条折线
    //下面是实现

    //节点数据的添加
    
void lineChart::dataInput(int i, int j, int k)//接受数据到达的信号
{
    int xsize=xList.size();
    if(xsize==21)//测试20个x轴坐标刷新一次图想,
    {
        xList.clear();
        xsize=xList.size();
    }
    if(xsize>=1)
        {
            xList.insert(xsize,xsize*2);
            yDrawList.insert(xsize,i);
            yWaList.insert(xsize,j);
            yWbList.insert(xsize,k);
            emit pointOver();//重绘信号
        }
        else{
        xList.insert(xsize,xsize*2);
        yDrawList.insert(xsize,i);
        yWaList.insert(xsize,j);
        yWbList.insert(xsize,k);
}
}

//折线绘制函数
   
  while(Counter < (xList.size()-1))
        {
        painter.setPen(pen);
        painter.drawLine(2*xList.value(Counter)+25,205-yDrawList.value(Counter)*2,
                         2*xList.value(Counter+1)+25,205-yDrawList.value(Counter+1)*2);
        Counter++;
        }
        Counter=0;
        while(Counter < (xList.size()-1))
        {
        painter.setPen(pen1);
        painter.drawLine(xList.value(Counter)*2+25,205-yWaList.value(Counter)*2,
                         xList.value(Counter+1)*2+25,205-yWaList.value(Counter+1)*2);
        Counter++;
        }
        Counter=0;
        while(Counter < (xList.size()-1))
        {
        painter.setPen(pen2);
        painter.drawLine(xList.value(Counter)*2+25,205-yWbList.value(Counter)*2,
                         25+xList.value(Counter+1)*2,205-yWbList.value(Counter+1)*2);
        Counter++;
        }




最后来张效果图


  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
实现Qt接收数据实时显示并绘制折线图,可以参考以下步骤: 1. 创建一个主窗口,添加一个QCustomPlot控件用于绘制折线图。 2. 在主窗口中创建一个Qtimer对象,用于定时更新数据。 3. 在Qtimer的槽函数中,读取串口数据并更新折线图。 4. 在QCustomPlot控件的初始化函数中,设置x和y轴范围、坐标轴标签等属性。 5. 在更新折线图的槽函数中,先将新的数据添加到QVector容器中,再将容器中的数据绘制折线图。 下面是一个简单的代码示例,仅供参考: ``` // 主窗口类 class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void updateData(); // 定时更新数据的槽函数 void plotGraph(); // 绘制折线图的槽函数 private: Ui::MainWindow *ui; QSerialPort *serialPort; // 串口对象 QTimer *timer; // 定时器对象 QVector<double> xData, yData; // 数据容器 }; // 构造函数 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 创建串口对象 serialPort = new QSerialPort(this); serialPort->setPortName("COM1"); serialPort->setBaudRate(QSerialPort::Baud9600); serialPort->setDataBits(QSerialPort::Data8); serialPort->setStopBits(QSerialPort::OneStop); serialPort->setParity(QSerialPort::NoParity); serialPort->open(QIODevice::ReadOnly); // 创建定时器对象 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateData())); timer->start(100); // 每100ms更新一次数据 // 初始化QCustomPlot控件 ui->plot->addGraph(); ui->plot->graph(0)->setPen(QPen(Qt::blue)); ui->plot->xAxis->setLabel("Time"); ui->plot->yAxis->setLabel("Value"); ui->plot->xAxis->setRange(0, 10); ui->plot->yAxis->setRange(0, 100); } // 析构函数 MainWindow::~MainWindow() { delete ui; } // 定时更新数据的槽函数 void MainWindow::updateData() { QByteArray data = serialPort->readAll(); // 处理数据... plotGraph(); // 更新折线图 } // 绘制折线图的槽函数 void MainWindow::plotGraph() { double x = QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0; // 获取当前时间 double y = 50; // 假设读取到的数据为50 xData.append(x); yData.append(y); // 绘制折线图 ui->plot->graph(0)->setData(xData, yData); ui->plot->replot(); } ```
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值