QWT 轴强制主刻度为零
Posted
技术标签:
【中文标题】QWT 轴强制主刻度为零【英文标题】:QWT axis force major tick at zero 【发布时间】:2018-08-21 04:49:58 【问题描述】:为了更好地理解我所做的和我想要实现的目标:
我想设置一个带有时间轴的 QwtPlot 来显示信号(电压随时间变化)。我为 QwtScaleDraw 编写了一个自己的实现,因此我可以添加一个偏移量(比如说 1000µs)并更改时间轴的“零”值。
没有我的系统在 123µs 加上此偏移后测量事件。所以我想用 setInterval(1000, 1123) 只显示这部分情节。但为了更好地理解情节,我想在此事件之前和之后添加一些时间。假设是事件长度的 10%
123µs 的 10% 是 12.3µs => setInterval(987.7, 1135.3)
轴现在显示从 -12.3µs 到 135.3µs 的时间跨度。
现在的问题:如何强制轴在 0µs 处显示主要刻度?
我是否必须使用 QwtScaleEngine 来计算我的刻度,或者它是 QwtScaleDraw 的工作还是我只是错过的轴内已经有一个函数?
编辑:
我认为问题出在我的偏移量上。我直接从我自己的QwtScaleDraw实现的函数QwtText label(qreal value) const中的原始值中减去这个值。所以在这个例子中要显示的零是值 1000。也许更好,所以用其他方式设置偏移量?
【问题讨论】:
【参考方案1】:我找到了解决办法:
创建一个自己的类继承QwtLinearScaleEngine。添加一个新的成员变量offset并添加getter/setter。覆盖函数 divideScale 并测试给定的间隔是否包含您的偏移量。如果没有或者offset为null,则使用QwtLinearScaleEngine的普通函数来计算分割比例。
当间隔包含您的偏移量时,使用给定的步长从该偏移量返回(减去)到下限。现在,您可以从这个值上升到上限,并将每个值添加为一个刻度。
QwtScaleDiv QwtLinearScaleEngineEx::divideScale(double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize) const
QwtScaleDiv div = QwtLinearScaleEngine::divideScale(x1, x2, maxMajorSteps, maxMinorSteps, stepSize);
QVector<QwtScaleDiv::TickType> tickTypes = QVector<QwtScaleDiv::TickType>() << QwtScaleDiv::MajorTick << QwtScaleDiv::MediumTick << QwtScaleDiv::MinorTick;
QList<double> ticksByType[QwtScaleDiv::NTickTypes];
if(offset() == 0 || !div.contains(offset()))
for(auto type : tickTypes)
ticksByType[type] = div.ticks(type);
else
for(auto type : tickTypes)
auto ticks = div.ticks(type);
if(ticks.length() > 1)
stepSize = qAbs(ticks[1]-ticks[0]);
for( double i=offset()-(stepSize*floor((offset()-div.lowerBound())/stepSize));
i<div.upperBound();
i+=stepSize )
ticksByType[type].append(i);
return QwtScaleDiv(QwtInterval(x1, x2), ticksByType);
【讨论】:
以上是关于QWT 轴强制主刻度为零的主要内容,如果未能解决你的问题,请参考以下文章