原创 QT 独立的窗口显示折线

2023-8-25 11:48 1632 5 5 分类: MCU/ 嵌入式 文集: QT学习

在原工程中新创建一个界面类。系统会生成一个窗口ui及相应的描述这个form的类头文件和CPP文件并加入到工程中。

将类名修改成想要的类型后。直接生成。

 

Pro 文件中增加

QT += charts

ui文件中放一个 QGraphicView控制,并提升为 QtChartView

在生成的h文件中增加

#include <QtCharts/QChartView>

#include <QtCharts/QLineSeries>

#include <QValueAxis>

 

 

QT_BEGIN_NAMESPACE

QT_CHARTS_USE_NAMESPACE

QT_END_NAMESPACE

除了要包含QtCharts这些库之外,还需要使用CHARTS的命名空间。

 

class DialogPMTData : public QDialog

{

    Q_OBJECT

 

在类定义中增加公有元素 QLineSeries 用于存放拆线数据序列,QValueAxis QValueAxis用于指定坐标轴 QChart 用于指定图片的组成。

public:

    explicit DialogPMTData(QWidget *parent = nullptr);

    ~DialogPMTData();

    QLineSeries *LineSerial;

    QChart *chart;

    QValueAxis *xaxis;

    QValueAxis *yaxis;

private:

    Ui::DialogPMTData *ui;

};

 

在构造函数中实例化这些指针

DialogPMTData::DialogPMTData(QWidget *parent) :

    QDialog(parent),

    ui(new Ui::DialogPMTData)

{

    ui->setupUi(this);

    LineSerial = new QLineSeries;

    LineSerial->append(1, 3.3);

    LineSerial->append(2.1, 0.2);

    LineSerial->append(3, 1.1);

    LineSerial->append(5.4, -0.2);

    LineSerial->append(6.0, 0.1);

    chart = new QChart();

    chart->legend()->hide();

    chart->addSeries(LineSerial);

//  chart->createDefaultAxes();

    xaxis = new QValueAxis();

    yaxis = new QValueAxis();

    xaxis->setRange(1.0,6.0);

    yaxis->setRange(-0.2,2.3);

    chart->addAxis(yaxis,Qt::AlignLeft);

    chart->addAxis(xaxis,Qt::AlignBottom);

    LineSerial->attachAxis(xaxis);

    LineSerial->attachAxis(yaxis);

    chart->setTitle("PMT data 20ms");

    //chartView = new QChartView(chart);

    ui->PMTDataView->setChart(chart);

}

 

MainWindow中加入这个窗口类,并作为公有对象。并定义一个定时器,用于定时刷新图像,并增加一个槽函数用于刷新图像。

class MainWindow : public QMainWindow

{

    Q_OBJECT

 

public:

    MainWindow(QWidget *parent = nullptr);

    ~MainWindow();

    SerialComm AASCom;

    DialogPMTData PMTView;

QTimer SerialParsetimer;

 

private slots:

void PmtDataParse1();

 

 

MainWindow的构造函数中定义并启动定时器。连接定时器timeout信号到槽函数。

MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent)

    , ui(new Ui::MainWindow)

{

    ui->setupUi(this);

 

    connect(&SerialParsetimer, &QTimer::timeout, this, &MainWindow::PmtDataParse1);

    // 设置定时器的时间间隔,单位为毫秒

    int interval = 10; // 10毫秒运行一次

    SerialParsetimer.start(interval);

    PMTView.show();

}

 

在槽函数中从接收到的数据中识别出正确数据,并更新图像的数据系列,计算坐标轴然后显示出来。

void MainWindow::PmtDataParse1(){

    btoi_typedef btoi;

    int i;  //ret = 0;

    int posstart = AASCom.rxbuf->indexOf("DATA");

    int posend = AASCom.rxbuf->indexOf("\r\n\r\n");

    if(posstart != -1){

        if(AASCom.rxbuf->length()>=posstart+608){

            if(AASCom.rxbuf->mid(posstart+604,4)=="\r\n\r\n"){

                PMTView.LineSerial->clear();

                for(i=0;i<150;i++){

                    memcpy(btoi.byte,AASCom.rxbuf->mid(i*4+4,4),4);

                    PMTView.LineSerial->append(i,btoi.idat/256);

                    }

                    AASCom.rxbuf->remove(posstart,608);

                    double ymin,ymax,deltay;

                    ymin = PMTView.LineSerial->at(0).y();

                    ymax = ymin;

                    for(int i=1;i<PMTView.LineSerial->count();i++){

                        ymin = qMin(PMTView.LineSerial->at(i).y(),ymin);

                        ymax = qMax(PMTView.LineSerial->at(i).y(),ymax);

                    }

                    PMTView.LineSerial->setColor(QColor(rand()%255,rand()%255,rand()%255));

                    deltay = ymax - ymin;

                    ymin -= deltay/10;

                    ymax += deltay/10;

                    PMTView.yaxis->setRange((int)ymin,(int)ymax);

                    PMTView.xaxis->setRange(0,149);

                    PMTView.chart->update();

            }

            else

                AASCom.rxbuf->remove(posstart,4);

        }

    }

}

这样从串口接收到的数据,就能在另一个窗口中显示出来了。

另外,程序运行时,需要改变窗口尺寸时同步改变图像显示的尺寸,可以将ChartView控件拖入一个垂直布局中,

并在构造函数中加入:

    this->setLayout(ui->verticalLayout);

 

 

作者: southcreek, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-408807.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条