QPainter read data and plot real time graph.
-
Hello everybody, I'm a beginner. I'm using qt in my project and try to let qt working read ADC and plot graph real time from paint event. Now I can read ADC and show on lcd widget realtime, but when I add a painter code to plot a graph. I can build it but when I run a program the window is suddenly closed. I don't know where is the critrically error that make a program suddenly closed. Thanks
Here it's my code
@#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
namespace Ui {
class Dialog;
}class Dialog : public QDialog
{
Q_OBJECTpublic:
explicit Dialog(QWidget *parent = 0);
int a2dVal;
int *a2dplot;
int i;~Dialog();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void read_ADC();
void paintEvent(QPaintEvent *e);private:
Ui::Dialog *ui;
};#endif // DIALOG_H
@@
#include "dialog.h"
#include "ui_dialog.h"
#include "mcp3008Spi.h"
#include <QTimer>
#include <QtCore>
#include <QtGui>QTimer*timer;
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(read_ADC()));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::read_ADC()
{
mcp3008Spi a2d("/dev/spidev0.0", SPI_MODE_0, 1000000, 8);int a2dChannel = 0; unsigned char data[3]; data[0] = 1; data[1] = 0b10000000 |( ((a2dChannel & 7) << 4)); data[2] = 0; a2d.spiWriteRead(data, sizeof(data) ); a2dVal = 0; a2dVal = (data[1]<< 8) & 0b1100000000; a2dVal |= (data[2] & 0xff); a2dplot[i] = a2dVal; ui->lcdNumber->display(a2dVal); i++;
}
void Dialog::on_pushButton_clicked()
{
timer ->start(10);
i = 0;
}
void Dialog::on_pushButton_2_clicked()
{
timer -> stop();
}
void Dialog::paintEvent(QPaintEvent e)
{
QPainter painter(this);
if(i>0)
{
painter.setPen( QPen(Qt::red, 5,Qt::SolidLine) );
painter.drawLine( i100, a2dplot[i-1], (i+1)*100, a2dplot[i]);
}
}
@ -
Unless I missed it you declare:
@
int *a2dplot;
@
as a pointer to an int but nowhere to you make it point to anything? However in your Read_ADC you have:@ a2dplot[i] = a2dVal;@
So you are writing to who knows where. I could have missed your assignment.
But one suggestion is instead of using int *a2dplot, use a container like a qvector. This way you can add data without having to worry about it and you can easily traverse the data using the iterators.