QwtPlot replot crash

Alles rund um die Programmierung mit Qt
Antworten
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

QwtPlot replot crash

Beitrag von serious_sammy »

Hallo,

mein Programm stürzt leider ohne Fehlermeldung ab wenn ich myplot->replot(); ausführe :roll:
Der Debugger sagt Segmentation Fault...

Woran liegts? Danke
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QwtPlot replot crash

Beitrag von Christian81 »

Ohne Code wird das wohl nix. Schätze myplot is unitialisiert.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: QwtPlot replot crash

Beitrag von serious_sammy »

Soo dann werden wir mal etwas lich ins Dunkel bringen.
Der erste Codeteil wird immer durchlaufen!

Code: Alles auswählen

    myplot = new QwtPlot(this);
    myplot->move(QPoint(400,50));
    myplot->setTitle("Messkurve");
    myplot->setCanvasBackground(Qt::white);
    myplot->setFixedSize(400,345);

    mycurve = new QwtPlotCurve();

    mycurve->setTitle("Line");
    mycurve->setPen(QPen(Qt::black));
    mycurve->setRenderHint(QwtPlotItem::RenderAntialiased, true);

    points << QPointF( 0.0, 4.4 ) << QPointF( 1.0, 3.0 )
           << QPointF( 2.0, 4.5 ) << QPointF( 3.0, 6.8 )
           << QPointF( 4.0, 7.9 ) << QPointF( 5.0, 7.1 );

    mycurve->setSamples( points );

    mycurve->attach(myplot);
    myplot->show();
soweit funktioniert es ganz gut, die Testwerte werden dargestellt. Nur wenn ich eine zweite Methode aufrufe, welche weitere Werte hinzufügt und dann den Plot updaten soll bekomme ich den Segmentation Fault. Beide sind Bestandteil der selben Klasse und der Erste Code-Teil wird immer aufgerufen. myplot ist ein Pointer vom Typ QwtPlot.

Code: Alles auswählen

void MainWindow::slot_set_values(double ptm_temp, double ptm_hv, double heat_temp, double nomtemp, double current, double voltage)
{
    using namespace GLOBAL;
    ui->pmtValueLabel->setText(QString::number(ptm_temp));
    ui->hvValueLabel->setText(QString::number(ptm_hv));
    ui->heatValueLabel->setText(QString::number(heat_temp));
    ui->nomValueLabel->setText(QString::number(nomtemp));
    ui->currenValueLabel->setText(QString::number(current));
    ui->vValueLabel->setText(QString::number(voltage));

    points << QPointF(i++, ptm_hv);

    QList<QPointF> plist = points.toList();
    if (!plist.isEmpty())
    {
        for(int i = 0; i < plist.count(); i++)
        {
            qDebug() << "listed" << plist[i].x() << plist[i].y();
        }
    }

    myplot->replot(); // Absturz :-(
}
Der QList-Teil ist lediglich zum debuggen um zu sehen ob die Werte auch hinzugefügt wurden. Danach stürzt er ab.

PS: Der QwtPlot wird keinem Layout hinzugefügt, sollte ich das ändern?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QwtPlot replot crash

Beitrag von Christian81 »

Sorry aber man sieht immer noch nicht wirklich welchen Pointer Du da jetzt benutzt. Ein minimales, wirklich kompilierbares Beispiel musst Du uns schon irgendwie geben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: QwtPlot replot crash

Beitrag von serious_sammy »

Ok wenns etwas mehr sein darf :wink:, hab alles überflüssige raus genommen, hoffe aber das es noch kompiliert.
mainwindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QThread>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QwtPlot *myplot;
    QwtPlotCurve *mycurve;

private slots:
    void on_startButton_clicked();
    void on_stopButton_clicked();

public slots:
    void slot_set_values(double ptm_temp, double ptm_hv, double heat_temp, double nomtemp, double current, double voltage);

private:
    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H
mainwindow.cpp

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

namespace GLOBAL
{
    QPolygonF points;
    int valuecounter = 0;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    using namespace GLOBAL;
    ui->setupUi(this);

    myplot = new QwtPlot(this);
    myplot->move(QPoint(400,50));
    myplot->setTitle("Messkurve");
    myplot->setCanvasBackground(Qt::white);
    myplot->setFixedSize(400,345);

    mycurve = new QwtPlotCurve();

    mycurve->setTitle("Line");
    mycurve->setPen(QPen(Qt::black));
    mycurve->setRenderHint(QwtPlotItem::RenderAntialiased, true);

    points << QPointF( 0.0, 4.4 ) << QPointF( 1.0, 3.0 )
           << QPointF( 2.0, 4.5 ) << QPointF( 3.0, 6.8 )
           << QPointF( 4.0, 70.9 ) << QPointF( 5.0, 7001 );

    mycurve->setSamples( points );

    mycurve->attach(myplot);
    myplot->show();
    //myplot->replot();  <-- das funktioniert!
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slot_set_values(double ptm_temp, double ptm_hv, double heat_temp, double nomtemp, double current, double voltage)
{
    using namespace GLOBAL;
    ui->pmtValueLabel->setText(QString::number(ptm_temp));
    ui->hvValueLabel->setText(QString::number(ptm_hv));
    ui->heatValueLabel->setText(QString::number(heat_temp));
    ui->nomValueLabel->setText(QString::number(nomtemp));
    ui->currenValueLabel->setText(QString::number(current));
    ui->vValueLabel->setText(QString::number(voltage));

    points << QPointF(valuecounter++, ptm_hv);

    QList<QPointF> plist = points.toList();
    if (!plist.isEmpty())
    {
        for(int i = 0; i < plist.count(); i++)
        {
            qDebug() << "points" << plist[i].x() << plist[i].y();
        }
    }

    myplot->replot(); <-- hier stürzt er ab!

    //qDebug() <<"set_values SLOT " <<ptm_temp<<" "<<ptm_hv<<" "<<heat_temp<<" "<<nomtemp<<" "<<current<<" "<<voltage;

}

trendyAndy
Beiträge: 54
Registriert: 27. März 2009 15:01

Re: QwtPlot replot crash

Beitrag von trendyAndy »

Servus!

Also abstürzen tut da bei mir nichts. Aber das plot wird auch nicht aktualisiert. Es wird erst akualisiert wenn ich das setSamples hinzufüge:

Code: Alles auswählen

mycurve->setSamples( points ); //hinzu gefügt
myplot->replot();
Hast du noch einen anderen Fehler drin ??
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: QwtPlot replot crash

Beitrag von serious_sammy »

Also "mycurve->setSamples( points );" hatte ich doch bereits eingefügt?

Muss ich setSamples jedes mal neu aufrufen wenn ich einen neuen Wert hinzugefügt habe?
Ich sehe es leider nicht weil "replot" nicht funktioniert :-(
trendyAndy
Beiträge: 54
Registriert: 27. März 2009 15:01

Re: QwtPlot replot crash

Beitrag von trendyAndy »

Moin,

Ich bin jetzt nicht so der Experte was es mit implizit und explizit shared auf sich hat, aber wenn du setRawSamples nimmst, dann machts keine Kopie der Daten sondern zeigt auf den Speicher deiner Daten . Wenn du dann autoreplot true hast sollte das doch eigentlich gehen. Immer wenn du dann setRawSamples aufrufst dann wird das Plot replottet.
Ich habe das in der Praxis noch nie so angewendet wie du es da versuchst, ich nutze immer setRawSamples und replotte das Plot nur wenn ich wieder einige Daten gesammelt habe.

Das setSamples " Initialize data with an array of points." Steht in der Doku. Denke dann brauchst du das schon.

Vielleicht kann das einer hier im Forum erklären. Würde mich auch interessieren.

Gruß
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: QwtPlot replot crash

Beitrag von serious_sammy »

So wie ich das jetzt verstanden habe funktioniert "setRawSamples" via call-by-reference, es wird also keine Kopie der Daten angelegt.
Von "autoplot" höre ich grad zum ersten mal, werd mal in der Doku nachsehen was ich so dazu finde ;-)

Mir ist es allerdings noch ein rätsel warum es bei dir funktioniert, er bei mir aber immer abschmiert? Hab nämlich eigentlich nichts verändert und lediglich alles raus genommen was nicht relevat war. Naja ich werd mal nur den geposteten code nutzen und gucken ob es das funktioniert.

Danke erstmal für die Hilfe, ich meld mich wieder ;-)
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: QwtPlot replot crash

Beitrag von serious_sammy »

trendyAndy bist mein Held, mit autoreplot läufts! Hab allerdings aktuell nur "setSamples" genutzt, geht aber trotzdem.
Oder sollte ich unbedingt "setRawSamples" nutzen?

Warum der manuelle replot nicht funktioniert ist mir allerdings immernoch ein rätsel.

Danke nochmal. Bis neulich Sammy
Antworten