QT之資料顯示
阿新 • • 發佈:2021-07-17
引言
目前,為了提高資料校對的效率,使用合理的顯示工具完成具體的資料處理,可以加速設計中除錯的速度,這也是自行設計上位機的意義所在。資料處理在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可以快速地完成資料顯示的設計,用於資料的分析處理。