Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QWT轴力主刻度为零_C++_Qt_Plot_Axis Labels_Qwt - Fatal编程技术网

C++ QWT轴力主刻度为零

C++ QWT轴力主刻度为零,c++,qt,plot,axis-labels,qwt,C++,Qt,Plot,Axis Labels,Qwt,为了更好地理解我所做的和我想要实现的: 我想设置一个带有时间轴的QwtPlot来显示信号(随时间变化的电压)。我为QwtScaleDraw编写了自己的实现,因此我可以添加偏移量(比如1000µs)并更改时间轴的“零”值 否我的系统在123µs加上此偏移量后测量事件。因此,我只想用setInterval(10001123)显示绘图的这一部分。但为了更好地理解情节,我想在事件前后加上一些时间。让我们假设事件长度的10% 123µs的10%为12.3µs=>设定区间(987.71135.3) 轴现在显

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

我想设置一个带有时间轴的QwtPlot来显示信号(随时间变化的电压)。我为QwtScaleDraw编写了自己的实现,因此我可以添加偏移量(比如1000µs)并更改时间轴的“零”值

否我的系统在123µs加上此偏移量后测量事件。因此,我只想用setInterval(10001123)显示绘图的这一部分。但为了更好地理解情节,我想在事件前后加上一些时间。让我们假设事件长度的10%

123µs的10%为12.3µs=>设定区间(987.71135.3)

轴现在显示从-12.3µs到135.3µs的时间跨度

现在的问题是:如何强制轴在0µs处显示主刻度

我是否必须使用QwtScaleEngine来计算我的滴答声,或者这是QwtScaleDraw的工作,或者在轴内部已经有一个我刚刚错过的函数


编辑

我认为问题在于我的补偿。我直接从我自己实现的QwtScaleDraw的函数QwtText label(qreal value)const中的原始值中减去该值。因此,在本例中,要显示的零是值1000也许它更好,所以用另一种方法设置偏移量?

我找到了一个解决方案:

创建自己的类inheritQwtLinearScaleEngine。添加一个新成员变量offset并添加getter/setter。覆盖函数divideScale,并测试给定间隔是否包含偏移量。如果不是或偏移量为空,请使用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);
}
QwtScaleDiv QwtLinearScaleEngineEx::divideScale(双x1,双x2,整数最大步长,整数最大最小步长,双步长)常量
{
QwtScaleDiv=QwtLinearScaleEngine::divideScale(x1,x2,最大主步数,最大最小步数,步长);
QVector类型=QVector()