【发布时间】:2011-10-18 19:12:45
【问题描述】:
我想创建带有两个水平轴的绘图。底轴是线性的,顶轴是非线性的。我有一个用于转换“底部值 - > 顶部值”的数据表。我发现 QwtScaleEngine 提供了这个功能。但我无法让它工作,因为在 QwtScaleEngine 和 QwtScaleDiv 的子类中定义了太多记录不充分的函数。
有什么建议吗?
【问题讨论】:
我想创建带有两个水平轴的绘图。底轴是线性的,顶轴是非线性的。我有一个用于转换“底部值 - > 顶部值”的数据表。我发现 QwtScaleEngine 提供了这个功能。但我无法让它工作,因为在 QwtScaleEngine 和 QwtScaleDiv 的子类中定义了太多记录不充分的函数。
有什么建议吗?
【问题讨论】:
您希望两个水平轴有效地覆盖共享一个轴的两个图,还是只是提供第一个水平轴的附加表示(例如不同的单位)?这可能不是那么相关,我只是想了解您的问题。
我首先建议您查看QwtPlot::updateAxes() documentation。这是我在 Qwt 官方文档中找到的关于绘图、比例引擎和比例划分之间关系的最佳描述。虽然我不认为 Qwt 的文档记录不好,但我确实认为它缺乏对概念的高级描述。
QwtScaleDiv 我认为更像是一种容器类型,包含轴边界和可能的刻度值。我看不出你有必要继承 QwtScaleDiv。
QwtScaleEngine 参与此转换是正确的,但至少在 Qwt 6.1.0 中还有更多内容。 QwtScaleEngine 支持带有 setTransformation() 的转换概念 (QwtTransform)。如果您的转换是一个简单的数学函数,例如对数、指数、二次、三次函数等,您应该能够使用QwtPowerTransform 或QwtLogTransform。如果这些不适用,您可以实现自己的QwtTransform 并将其分配给QwtScaleEngine。据我所知,转换必须是双向的,即同时实现transform 和invTransform。根据我的经验,它还必须转换与比例引擎关联的轴关联的所有绘图项的值,包括网格线、区域等。除了默认的QwtLinearScaleEngine,我还没有尝试在其他比例引擎上使用转换,但是效果很好。这是一个强大的概念。另外,请查看SVN playground (6.1.0) 中的 scaleengine 示例。
【讨论】: