QWT轴力主要刻度为零

时间:2018-08-21 04:49:58

标签: c++ qt plot axis-labels qwt

为了更好地理解我所做的事情和想要实现的事情:

我想设置一个带有时间轴的 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。也许最好以其他方式设置偏移量?

1 个答案:

答案 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);
}