QT之数据显示

Posted on 2021-07-17 13:49  绿叶落秋风  阅读(1398)  评论(0编辑  收藏  举报

引言

  目前,为了提高数据校对的效率,使用合理的显示工具完成具体的数据处理,可以加速设计中调试的速度,这也是自行设计上位机的意义所在。数据处理在LabVIEW中是比较简单的,直接调用即可。在QT中可能需要采用其他的模块。

学习

  QT5中比较快捷地实现图表的方式是QtCharts库,内置的QChartView和QLineSeries可以完成坐标轴和数据线的创建,配合其他类,可以快速完成一个折线图的创建,可以用于记录数据的变化,在数据处理上有较大的意义。这里以这个图为模块,对文件中的数据进行处理。

  需要注意的点不多,一个是pro中不要忘记添加qt += charts,还有是命名空间QT_CHARTS_USE_NAMESPACE,然后是三个关键变量QChart、QLineSeries和坐标QValueAxis。对这三个变量进行操作,就可以完成图表的初始化和数据的刷新。

目标

  作为测试用的上位机,记录多个数据的变化趋势是基本的功能。为了提高实用性,这里也是基于文件进行处理。处理过程中采用灵活的正则匹配方式,实现所有的数据的高速处理。预期使用txt文本完成多数据的变化显示。

结构

图表显示

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
       ui->setupUi(this);

       m_series=new QLineSeries;
       m_chart=new QChart;

       m_series=new QLineSeries;
       m_series->setName("ss");
       m_chart->addSeries(m_series);
       m_chart->createDefaultAxes();


       m_axisX=new QValueAxis;
       m_axisX->setRange(0,60);
       m_axisX->setGridLineVisible(true);
       m_axisX->setTickCount(11);     //标记的个数
       m_axisX->setMinorTickCount(5); //次标记的个数

       m_axisY=new QValueAxis;
       m_axisY->setRange(-5,10);
       m_axisY->setGridLineVisible(true);
       m_axisY->setTickCount(6);
       m_axisY->setMinorTickCount(2);



       m_chart->setAxisX(m_axisX,m_series);
       m_chart->setAxisY(m_axisY,m_series);
       m_chart->legend()->hide();

       ui->graphicsView->setChart(m_chart);
       ui->graphicsView->setRenderHint(QPainter::Antialiasing);

       m_timer.setInterval(1000);
       m_timer.start();
       connect(&m_timer,SIGNAL(timeout()),this,SLOT(handleTimeout()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_refreshData_clicked()
{
    int i;
    for(i=0;i<1000;i++)
    {
        m_series->append(i,sin(i));
    }
}

  前半段代码源自网络,后半段代码简单的定义。

文本读取

  从txt文本中以单个字节为间隔的方式读取整个串行数据。

    QFile fil(QDir::currentPath()+".txt");
    fil.open(QIODevice::ReadOnly);
    char buf[1];
    qint64  addr;
    qint64  length;
    QString buf_exp(buf);
    QRegExp exp("[0-9a-fA-F]");
    addr=0;
    int i;
    bool toStop;
    toStop = false;
    i=0;
        while(!toStop)
        {
            fil.seek(addr);
            length = fil.read(buf,sizeof (buf));
            buf_exp = buf;
            if(!exp.indexIn(buf_exp))
            {
                qDebug()<<buf_exp<<":"<<sizeof(buf_exp);
                int x= atoi(buf);
                m_series->append(i,x);
                i++;
                addr=addr+length;
            }
            else
            {
                qDebug()<<"error";
                addr=addr+1;
            }
            if(addr>=fil.size())
            {
                fil.close();
                toStop = true;
            }
        }

  为了方便控制位宽,采用单字节读取,后面再逐渐修改正则匹配的形式。

效果

上面是基于函数生成的理想波形,下图是基于字节读取的数据。

结论

  QT5可以快速地完成数据显示的设计,用于数据的分析处理。

附件

  工程托管