Qt---多线程绘制折线图

本文介绍如何在Qt环境中使用多线程来绘制折线图。由于子线程不能直接操作UI,提出了两种思路:一是子线程处理数据,主线程绘制;二是通过信号槽机制,在子线程处理后,主线程执行更新UI的代码。示例代码中,使用了qCustomPlot库,并强调遇到信号注册错误时的解决方法。
摘要由CSDN通过智能技术生成

Qt多线程绘制折线图

需求:在ui中绘制折线图,需要在子线程中操作ui界面上的对象。因为子线程中创建图形化相关的不被允许,因此【思路1:】在子线程中仅仅读取数据,进行数据处理,将数据处理的结果返回给主线程,主线程操作ui界面进行绘制折线图。【思路2:】将ui界面的控件使用指针传递的方式直接传递给子线程使用,子线程中进行数据处理,处理完毕绘制折线图。(实际操作中,折线图需要customplot->replot()之后才会自动更新到ui界面上,否则需要人为的用鼠标在ui的相对应的绘图控件上点击或者滚动滑轮才可显示图像,但是子线程不允许此代码,因此需要使用信号和槽在主线程中执行此句代码。)

  • Qt多线成使用的是将继承于QObject的对象moveToThread到QThread对象中的方法
  • 绘图使用的是qCustomPlot第三方库

代码如下

  • my_task.h
#ifndef MY_TASK_H
#define MY_TASK_H

#include <QObject>
#include "qcustomplot.h"

class My_Task : public QObject
{
   
    Q_OBJECT
public:
    explicit My_Task(QObject *parent = nullptr);
 

signals:

 
     void task_0_signals(QCustomPlot* customplotOnThread);//使用的是主线程ui上的customPlot
     void task_draw0End_signal();//发送绘图结束信号
     void task_draw1End_signal(QCustomPlot *customPlot);
     void task_draw2End_signal(QVector<double> ticksVector,
                               QVector<double> valuesVector,
                               double maxX,
                               double maxY,
                               QColor color);

public slots:
    void task_draw0(QCustomPlot *customPlot,QCPGraph* graph,QCPGraph* graph1);
    void task_draw1();
    void task_draw2();

  void on_filePath_signal(QString filePath);


private:
    QCustomPlot *customPlot;
    QCPAxis *keyAxis;
    QCPAxis *valueAxis;
    QCPGraph *graph0 = nullptr;

    QString filePathName;
};

#endif // MY_TASK_H

  • my_task.cpp


#include "my_task.h"
#include "unistd.h"


My_Task::My_Task(QObject *parent) : QObject(parent)
{
   

}
 
/**
 * @brief My_Task::task_draw0
 * @param customPlot
 * 要从主线程的ui界面中传递customplot控件过来在子线程中调用,将主线程的graph对象传递
 * 过来,
 */
void My_Task::task_draw0(QCustomPlot *customPlot,QCPGraph* graph,QCPGraph* graph1)
{
   
    customPlot->setNoAntialiasingOnDrag(true);
    keyAxis = customPlot->xAxis;
    valueAxis = customPlot->yAxis;


 
//    graph0 = new QCPGraph(keyAxis,valueAxis);//子线程中新建图形化相关的对象报错

    QFile file(filePathName);
    QTextStream stream(&file);
   bool isOK = file.open(QIODevice::ReadOnly| QIODevice::Text);
   if(!isOK){
   

       qDebug()<<"文件打开失败";
     return;
   }

     QString str;
     //QVector<QString> strVector;
     QVector<double> amplitudeVector,phaseVector;
     while(!stream.atEnd()){
   
       str = stream.readLine();

       amplitudeVector<<str.section(" ",0,0).toDouble();
       phaseVector<<str.section(" ",1,1).toDouble();

     }

     QVector<double> ticksVector0,dataVector0,ticksVector1,dataVector1;

   dataVector0 = amplitudeVector;
   dataVector1 = phaseVector;
  int maxX = dataVector0.count();
  int maxY0 = 0,maxY1 = 0,maxY = 0;
     for(int i=0;i<dataVector0.count();i++){
   
          ticksVector0 << i;
          ticksVector1 << i;
          if(maxY0 <dataVector0.at(i))
              maxY0 = dataVector0.at(i);
          if(maxY1 <dataVector1.at(i))
              maxY1 
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值