在原工程中新创建一个界面类。系统会生成一个窗口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
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论