热度 5
2023-8-25 11:48
1570 次阅读|
0 个评论
在原工程中新创建一个界面类。系统会生成一个窗口 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 ); // 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 );