在 QWT Plot 中更改轴刻度和标签以在毫米和英寸之间切换
Posted
技术标签:
【中文标题】在 QWT Plot 中更改轴刻度和标签以在毫米和英寸之间切换【英文标题】:Change axis ticks and label to switch between millimeter and inch in QWT Plot 【发布时间】:2013-09-03 08:33:44 【问题描述】:我想要的是切换轴标签和刻度以匹配最佳显示英寸和毫米而不改变曲线点。我创建了一个自定义 QwtScaleDraw 并覆盖了 label() 方法,但这不会改变刻度。
class QwtMyScaleDraw : public QwtScaleDraw
public:
QwtMyScaleDraw() : QwtScaleDraw()
protected:
QwtText label(double value) const
// global conversion routine that creates a display string either as millimeter or inch
return ConvertToString(value, ConversionFromMillimeter);
;
您可以在下图中看到此行为:
左边的比例是原始比例,中间的比例是我的自定义标签,右边是想要的比例。
在不使用手动转换值再次添加整条曲线的情况下获得所需结果的最佳方法是什么?
【问题讨论】:
【参考方案1】:在 qwt 库作者的帮助下,我找到了解决方案。答案是派生自QwtLinearScaleEngine
类并重载autoScale
和divideScale
方法。
在我的实现中,可以选择任何转换因子(默认为 1 = 无转换)。这是我的代码:
class QwtUnitScaleDraw : public QwtScaleDraw
public:
QwtUnitScaleDraw(double ConversionFactor = 1.0) : QwtScaleDraw(), _ConversionFactor(ConversionFactor)
protected:
QwtText label(double value) const
return QwtScaleDraw::label(value * _ConversionFactor);
protected:
double _ConversionFactor;
;
class QwtUnitScaleEngine: public QwtLinearScaleEngine
public:
QwtUnitScaleEngine(double ConversionFactor = 1.0) : QwtLinearScaleEngine(10), _ConversionFactor(ConversionFactor)
void autoScale(int maxSteps, double &x1, double &x2, double &stepSize) const
x1 *= _ConversionFactor;
x2 *= _ConversionFactor;
stepSize *= _ConversionFactor;
QwtLinearScaleEngine::autoScale(maxSteps, x1, x2, stepSize);
x1 /= _ConversionFactor;
x2 /= _ConversionFactor;
stepSize /= _ConversionFactor;
QwtScaleDiv divideScale(double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0) const
x1 *= _ConversionFactor;
x2 *= _ConversionFactor;
stepSize *= _ConversionFactor;
QwtScaleDiv Div = QwtLinearScaleEngine::divideScale(x1, x2, numMajorSteps, numMinorSteps, stepSize);
QList<double> Ticks[QwtScaleDiv::NTickTypes];
Ticks[QwtScaleDiv::MajorTick] = Div.ticks(QwtScaleDiv::MajorTick);
for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MajorTick].count(); i++)
Ticks[QwtScaleDiv::MajorTick][i] /= _ConversionFactor;
Ticks[QwtScaleDiv::MediumTick] = Div.ticks(QwtScaleDiv::MediumTick);
for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MediumTick].count(); i++)
Ticks[QwtScaleDiv::MediumTick][i] /= _ConversionFactor;
Ticks[QwtScaleDiv::MinorTick] = Div.ticks(QwtScaleDiv::MinorTick);
for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MinorTick].count(); i++)
Ticks[QwtScaleDiv::MinorTick][i] /= _ConversionFactor;
return QwtScaleDiv(QwtInterval(x1 / _ConversionFactor, x2 / _ConversionFactor), Ticks);
protected:
double _ConversionFactor;
;
【讨论】:
以上是关于在 QWT Plot 中更改轴刻度和标签以在毫米和英寸之间切换的主要内容,如果未能解决你的问题,请参考以下文章