Qt多线程绘制折线图
需求:在ui中绘制折线图,需要在子线程中操作ui界面上的对象。因为子线程中创建图形化相关的不被允许,因此【思路1:】在子线程中仅仅读取数据,进行数据处理,将数据处理的结果返回给主线程,主线程操作ui界面进行绘制折线图。【思路2:】将ui界面的控件使用指针传递的方式直接传递给子线程使用,子线程中进行数据处理,处理完毕绘制折线图。(实际操作中,折线图需要customplot->replot()之后才会自动更新到ui界面上,否则需要人为的用鼠标在ui的相对应的绘图控件上点击或者滚动滑轮才可显示图像,但是子线程不允许此代码,因此需要使用信号和槽在主线程中执行此句代码。)文章来源地址https://www.toymoban.com/news/detail-633659.html
- 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
文章来源:https://www.toymoban.com/news/detail-633659.html
到了这里,关于Qt---多线程绘制折线图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!