Seite 1 von 1
QwtPlot replot crash
Verfasst: 6. Oktober 2013 12:13
von serious_sammy
Hallo,
mein Programm stürzt leider ohne Fehlermeldung ab wenn ich myplot->replot(); ausführe
Der Debugger sagt Segmentation Fault...
Woran liegts? Danke
Re: QwtPlot replot crash
Verfasst: 6. Oktober 2013 22:56
von Christian81
Ohne Code wird das wohl nix. Schätze myplot is unitialisiert.
Re: QwtPlot replot crash
Verfasst: 7. Oktober 2013 11:42
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?
Re: QwtPlot replot crash
Verfasst: 8. Oktober 2013 06:26
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.
Re: QwtPlot replot crash
Verfasst: 9. Oktober 2013 20:31
von serious_sammy
Ok wenns etwas mehr sein darf

, 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;
}
Re: QwtPlot replot crash
Verfasst: 24. Oktober 2013 10:57
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 ??
Re: QwtPlot replot crash
Verfasst: 25. Oktober 2013 13:23
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

Re: QwtPlot replot crash
Verfasst: 26. Oktober 2013 11:01
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ß
Re: QwtPlot replot crash
Verfasst: 26. Oktober 2013 15:56
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

Re: QwtPlot replot crash
Verfasst: 28. Oktober 2013 16:26
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