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 轴强制主刻度为零的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 中使用 QWT 生成间隔不等的图形

d3.js - 对数刻度,范围为零和零

qwt 绘图曲线轴不可见

如何从ggplot中原点的第一个轴刻度开始

excel横坐标中时间刻度如何设置成整点?

Qwt:将日期/时间标签文本在底部轴上对齐