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):
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