QwtPlot - mehrere x-Achsen/-Skalen

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
Antworten
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

QwtPlot - mehrere x-Achsen/-Skalen

Beitrag von -=Freaky=- »

hi,

ich arbeite mal wieder mit qwt und qt.
ich habe ein widget, welches von QwtPlot abgeleitet ist, und das muss eine variable anzahl von x-achsen bzw. -skalen haben, alle untereinander, alle separat.

quasi QwtPlot mehrmals untereinander, allerdings in einem widget und lediglich separate graphen und skalen.

das ganze soll natuerlich moeglichst einheitlich aussehen und eben nicht wie mehrere untereinander angeordnete, einzelne widgets.

so sieht es im moment aus:
Bild

so soll es aussehen:
Bild
(in der jeweiligen fusszeile unter der x-achse stehen infos zum graphen darueber)

das bisherige widget ist von QwtPlot abgeleitet und soll nun eben so erweitert werden, dass mehrere x-skalen drin sind und damit mehrere von QwtPlotCurve abgeleitete klassen gezeichnet werden koennen.
daher moechte ich ungern mehrer QwtPlot-widgets untereinander kapseln, evtl. mit einem layout, weil ich das ganze wohl fast komplett neu aufsetzen muesste.
wenn das allerdings die sinnvollste moeglicheit oder die mit dem wenigsten aufwand waere, waere das zur not auch ok.

ich wuerde gerne ein paar ratschlaege hoeren wie man das ganze evtl. elegant loesen koennte, danke dafuer im voraus!

mfg,
julian
Zuletzt geändert von -=Freaky=- am 3. September 2008 15:16, insgesamt 1-mal geändert.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ok sorry fuer die bloede frage, irgendwann bin ich dann auch mal drauf gekommen, QwtPlotScaleItem zu probieren ...
habs noch nicht ganz ausprobiert, aber damit sollte es relativ umstandslos moeglich sein.

mfg,
julian
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

hm das ganze scheint nicht so zu funktionieren, wie ich will.
die skalen bekomm ich nun zwar rein, allerdings waere eine moeglichkeit nicht schlecht, n QwtPlotCurves (bzw. davon abgeleitete klassen) untereinander in ein QwtPlot zu zeichnen.

ich koennte natuerlich immer die koordinaten aller kurven staendig neu berechnen (immer wenn eine dazukommt, geloescht wird, bei jedem resize, usw. usf.), aber darauf habe ich eigentlich keine grosse lust.
jede kurve bekommt am ende noch eine eigene x-achse (QwtPlotScaleItem), deren hoehe nicht mit der y-skala variiert und ich weiss bisher nicht, wie ich die genaue hoehe (in pixeln) bekomme, daher ist das berechnen der koordinaten fuer die einzelnen kurven (die ja in skalen-koordinaten angegeben werden) zusaetzlich schwer ... muss aber auch so nicht sein. :)

hat dazu vllt. jemand eine idee?

danke im voraus!
mfg,
julian
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ich bin schon etwas weiter, allerdings stellt sich immer noch die frage, wie ich die hoehe eines QwtPlotScaleItem bekomme, in pixel- oder skalenkoordinaten ...
falls jemand etwas weiss, bitte melden! :)

danke im voraus,
mfg,
julian
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

hi,

i habe QwtScaleDraw::extent gefunden, ist das die richtige methode, um die hoehe einer skala, genauer eines QwtPlotScaleItem zu bekommen?
falls ja, dachte ich, dass die hoehe in pixeln zurueckgegeben wird, weil es int ist.

i habe allerdings immer noch probleme, die anscheinend in der berechnung der hoehe eines scale items liegen.
entweder, weil ich einiges nicht verstanden habe oder ich einfach irgendwo einen bloeden fehler drin hab.
waere nett, wenn sich jemand meinen code unten ansehen koennte.
vielen dank dafuer im voraus! :)

wie gesagt, ich habe eine plot klasse, abgeleitet von QwtPlot, eine kurven klasse, abgeleitet von QwtPlotCurve und eine dritte scale draw klasse, abgeleitet von QwtScaleDraw.

in meiner scale draw klasse sieht die extent methode nun wie folgt aus:

Code: Alles auswählen

int MyScaleDraw::extent()
{
	// m_labelsFont: font fuer die labels - wer haette das gedacht ;-)
	return QwtScaleDraw::extent( QPen(), m_labelsFont );
}
in meiner plot klasse sieht die addCurve methode nun so aus:

Code: Alles auswählen

void MyPlot::addCurve( MyCurve *p_curve )
{
	if( p_curve )
	{
		setAxisScale( xBottom, 0, 5, 1 ); // nur fuer testzwecke
		
		double scaleHeight = 0; // hoehe e. QwtPlotScaleItem
		p_curve->attach( this );
		if( m_curves.count() > 0 )  // m_curves: QMap< MyCurve*, QwtScaleDraw* >
		{
			QwtPlotScaleItem *s = new QwtPlotScaleItem;
			s->setScaleDraw( m_xScaleDraw );
			s->attach( this );
			m_curves.insert( p_curve, s );
			// hier bin ich sehr unsicher, ob das so stimmt
			// ( m_xScaleDraw: MyScaleDraw fuer xBottom skalen)
			if( m_xScaleDraw )
				scaleHeight = canvasMap( yLeft ).invTransform( m_xScaleDraw->extent() );
		}
		else
			m_curves.insert( p_curve, NULL );
		
		// (yLeft-skala ist 100 einheiten hoch)
		double curveHeight = ( 100 - ((m_curves.count() - 1)*scaleHeight)) / (m_curves.count() );
		QMap< MyCurve*, QwtPlotScaleItem* >::iterator it = m_curves.begin();
		int i = 0;
		while( it != m_curves.end() )
		{
			if( it.key() )
			{
				// MyCurve hat 2 neue elemente:
				// height => hoehe der "bloecke"
				// yPos => position (oberkante) auf der y-achse
				it.key()->setHeight( curveHeight );
				it.key()->setYPos( ( (i + 1) * curveHeight ) + ( i * scaleHeight ) );
			}
			if( it.value() )
					it.value()->setPosition( it.key()->yPos() - it.key()->height() );
			it++;
			i++;
		}
		replot();
	}
}
wie erwaehnt, wird scheinbar scaleHeight falsch berechnet (ich habe das mit einer message box getestet) ... allerdings habe ich keine ahnung, warum, sofern extent wirklich das ist, was ich brauche.

hier ein screenshot davon, wie es momentan aussieht, nachdem 2 kurven hinzugefuegt wurden (via addCurve):
Bild

es waere wirklich nett, wenn sich jemand meiner erbarmen koennte und sich das zeug oben mal ansehen wuerde.
na, wenn jemand bis hier liest, wird das wohl schon geschehen sein, also danke schonmal!

wer helfen moechte, ist herzlich eingeladen. :)

mfg,
julian
Antworten