[gelöst]QwtPlot/QwtPlotCurve: Achsenbeschriftung, Titel, ...

Alles rund um die Programmierung mit Qt
Antworten
chr3
Beiträge: 8
Registriert: 27. September 2008 11:17

[gelöst]QwtPlot/QwtPlotCurve: Achsenbeschriftung, Titel, ...

Beitrag von chr3 »

Moin,

ich habe ein VS2008 Projekt, benutze Qt4.4.1, Qwt-5.1.1 und möchte einen Graphen plotten.
Wie kann man einer QwtPlotCurve einen Titel, Achsenbeschriftung und eine Skala hinzufügen?
Die Befehle setAxis oder xAxis bzw. yAxis, sowie crv.setTitle("Titel"); haben keine sichtbare Wirkung.
Woran könnte es liegen, daß die Befehle nicht angenommen werden? Fehler werden nicht ausgegeben.
Die Strukur:

Datei: MyWidget.h

Code: Alles auswählen

#include "MyPlot.h"
class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{	
	MyPlot* plot = new MyPlot(/*this*/);
	/*...*/
}
Datei: MyPlot.h

Code: Alles auswählen

class MyPlot : public QFrame //QWidget
{
public:
    MyPlot(/*QWidget *parent = 0*/);

	QwtPlotCurve crv;

};

MyPlot::MyPlot(/*QWidget *parent*/) 
: QFrame(/*parent*/)
{

	xMap.setScaleInterval(-10.0, 70.0);			// AnzeigeInterval
	yMap.setScaleInterval(-2.0, 2.0);

    setFrameStyle(QFrame::Box|QFrame::Raised);
    setLineWidth(2);
    setMidLineWidth(3);
	for(int i=0; i<Size;i++)
    {   
		xval[i] = (double)i;								// WertZuweisung
		yval[i] = sin((double)i);
    }
	crv.setStyle(QwtPlotCurve::Lines);
    crv.setCurveAttribute(QwtPlotCurve::Fitted);

	crv.setAxis(20,5);				// Titel und Achsenbeschriftung
	crv.setTitle("Titel");			// werden leider nicht angezeigt
}


Alternativ habe ich versucht statt QwtPlotCurve nun QwtPlot zu verwenden.
Vestehe ich es richtig, daß QwtPlot das große gesamte Konstrukt ist, dem man
eine QwtPlotCurve und eine QwtPlotScale usw. hinzufügren kann?
Leider habe ich das Problem, daß das erfolgreich kompilierte Porjekt nicht startet,
sobald eine Instanz von QwtPlot im Projekt erzeugt wird.

(siehe vorletzte Zeile)

DATEI: "MyWidget.h"

Code: Alles auswählen

#include <MyPlot2.h>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
	MyPlot2* plot2 = new MyPlot2();
}
DATEI: "MyPlot2.h

Code: Alles auswählen

#include <qwt_plot.h>



class MyPlot2 : public QFrame //QWidget
{
public:
    MyPlot2(/*QWidget *parent = 0*/);

};

MyPlot2::MyPlot2(/*QWidget *parent*/) 
: QFrame(/*parent*/)
{
	QwtPlot plot;  
	// nach erzeugen einer Instanz von QwtPlot verweigert das Programm die Ausführung
}
Kann mir bitte jemand weiterhelfen? Ich bin total ratlos...
Christian
Zuletzt geändert von chr3 am 29. September 2008 13:13, insgesamt 1-mal geändert.
chr3
Beiträge: 8
Registriert: 27. September 2008 11:17

Beitrag von chr3 »

Hallo,

kann man einen QwtPlot auch in einem QWidget definieren? Muß man mit einem bestimmten Projekt arbeiten, daß es funktioniert? Ich habe jetzt ein bestehendes Pojekt vor mir und wollte es erweitern.
Ich frage mich, warum das Programm abbricht, sobald die Zeile "QwtPlot plot();" auftaucht. Eine QwtPlotCurve kann ich ohne Probleme erzeugen und anzeigen, nur eben QwtPlot nicht.

Kann mir jemand weiterhelfen?

Nette Grüße,
Christian
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag von MiKla »

Beim kompilieren von qwt wird eine Designer Plugin DLL erzeugt. Damit kannst du im Designer ein QwtPlot in deine GUI einbinden oder von Hand.
Ich habe ein Plot in einem Splitter:

Code: Alles auswählen

qwtPlot = new QwtPlot(splitter);

void QtTest01::setupPlot()
{
    grid = new QwtPlotGrid;
    grid->setMajPen(QPen(Qt::gray, 0, Qt::DotLine));
    grid->attach(qwtPlot);
    qwtPlot->setAxisScale(QwtPlot::yLeft, -10, 10);

	zoomer = new Zoomer(qwtPlot->canvas());
    zoomer->setSelectionFlags(QwtPicker::DragSelection | QwtPicker::CornerToCorner);
    zoomer->setRubberBandPen(QPen(Qt::red, 2, Qt::DotLine));
    zoomer->setTrackerPen(QPen(Qt::red));
    zoomer->setTrackerMode(QwtPicker::AlwaysOn);
    zoomer->setEnabled(false);
    zoomer->zoom(0);
    

//    panner = new QwtPlotPanner(qwtPlot->canvas());
//    panner->setMouseButton(Qt::MidButton);
//    panner->setMouseButton(Qt::RightButton);
    picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
    								QwtPicker::PointSelection | QwtPicker::DragSelection, 
    								QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn, 
    								qwtPlot->canvas());
	picker->setRubberBandPen(QColor(Qt::black));
    picker->setRubberBand(QwtPicker::CrossRubberBand);
    picker->setTrackerPen(QColor(Qt::red));
}


void QtTest01::showPlot()
{
	qwtPlot->setTitle(fileName);
	qwtPlot->insertLegend(new QwtLegend(), QwtPlot::BottomLegend);
	if (neusBild)
		qwtPlot->clear();
	if (stOszi.anzahlDaten == 0)
		return;			
	double* value = new double[stOszi.anzahlDaten];
	double **data = new double *[stOszi.anzahlDaten];
	for (int i=0; i<stOszi.countChannels; i++)
	{
		if (stOszi.skalFaktor[i] == 0)
			continue;
		if (neusBild)
		{
			cPlot[i] = new QwtPlotCurve();
			cPlot[i]->setRenderHint(QwtPlotItem::RenderAntialiased);
			cPlot[i]->attach(qwtPlot);
			cPlot[0]->setXAxis(QwtPlot::xBottom);
			cPlot[0]->setYAxis(QwtPlot::yLeft);
		}
		data[i] = new double[stOszi.anzahlDaten];
		for (int k=0 ; k<stOszi.anzahlDaten; k++)
	    {
			value[k] = k * (stOszi.zeizbasis);
	    	data[i][k] = ((stOszi.daten[i]->value(k).toDouble()+ (stOszi.offset[i]))/(stOszi.skalFaktor[i]));
			if (neusBild)
				cPlot[i]->setTitle(model->data(QModelIndex(model->index(i,1))).toString());
	        switch(i)
	        {
	                case 0:     cPlot[i]->setPen(QPen(Qt::blue));
	                            break;
	                case 1:     cPlot[i]->setPen(QPen(Qt::red));
	                            break;
	                case 2:     cPlot[i]->setPen(QPen(Qt::green));
	                            break;
	                case 3:     cPlot[i]->setPen(QPen(Qt::yellow));
	                            break;
	                case 4:     cPlot[i]->setPen(QPen(Qt::darkGreen));
	                            break;
	                case 5:     cPlot[i]->setPen(QPen(Qt::magenta));
	                            break;
	                case 6:     cPlot[i]->setPen(QPen(Qt::gray));
	                            break;
	                case 7:     cPlot[i]->setPen(QPen(Qt::cyan));
	                            break;
			}
	        cPlot[i]->setData(value, data[i], stOszi.anzahlDaten);
	    }
	}
    qwtPlot->setAxisScale(QwtPlot::xBottom, 0, ((stOszi.zeizbasis) * (stOszi.anzahlDaten)));
    qwtPlot->replot();
    zoomer->setZoomBase();
    qwtPlot->replot();
    tableView->resizeColumnsToContents();
    delete [] value;
    delete [] data;
}
vielleicht hilft Dir das weiter.
chr3
Beiträge: 8
Registriert: 27. September 2008 11:17

Beitrag von chr3 »

Hi Michael,

vielen Dank. Dein Code hat mich zumindest ein Stückchen weiter gebracht.
Inzwischen konnte ich ein neues Projekt erstellen, in dem ich ohne weiteres einen QwtPlot erzeugen konnte. Alles läuft super.

Das Problem sieht nun wiefolg aus:

Sobald ich nun den Code aus dem neuen Projekt 1:1 in mein bestehendes Projekt kopiere, kompiliert er zwar ohne Fehlermeldungen, stürzt aber unmittelbar nach dem Start ab. Das Problem hatte ich ja schon vorher, deswegen habe ich daran gezweifelt, daß ich bei QwtPlot einen Fehler gemacht habe. - Da es in dem anderen Projekt aber läuft, schließe ich das nun aus.
Das bestehende Projekt verträgt sich nicht mit "QwtPlot plot();" Sobald diese Zeile auftaucht, kommt es zum Absturz. Ich habe schon nachgesehen, ob ich irgendwelche include- oder library-directorys vergessen habe, aber dabei ist mir nichts aufgefallen.

[Da meine Frage nun in eine ganz andere Richtung geht und ich den Umgang mit QwtPlot und QwtPlotCurve nun vermutlich verstanden habe (entgegen der Überschrift), erkläre ich diesen Thread als gelöst.]



Nette Grüße,
Christian
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag von MiKla »

da hilft nur Code zeigen!!!
Antworten