为了更好地理解我所做的事情和想要实现的事情:
我想设置一个带有时间轴的 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标签(qreal值)const 内部的原始值中减去该值。因此,在此示例中,要显示的零值为1000。也许最好以其他方式设置偏移量?
答案 0 :(得分:0)
我找到了解决方法:
创建一个继承 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);
}