Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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_OBJECT

    public:
    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( i
    100, 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.


Log in to reply