Ось QWT заставляет главный тик в нуле

Для лучшего понимания того, что я сделал и чего хочу достичь:

Я хочу создать QwtPlot с осью времени для отображения сигнала (напряжение во времени). Я написал собственную реализацию для QwtScaleDraw, чтобы я мог добавить смещение (скажем, 1000μs) и измените «нулевое» значение оси времени.

Нет, моя система измеряет событие после 123 мкс плюс это смещение. Поэтому я хочу отображать только эту часть сюжета с setInterval (1000, 1123) . Но для лучшего понимания сюжета я хочу добавить немного времени до и после этого события. Допустим, 10% от продолжительности мероприятия

10% от 123 мкс — это 12,3 мкс => setInterval (987,7, 1135,3)

Ось теперь показывает временной интервал от -12,3 мкс до 135,3 мкс.

СЕЙЧАС ВОПРОС: Как я мог заставить ось показывать основной тик в 0 мкс?

Должен ли я использовать QwtScaleEngine рассчитать мои тики или это работа для QwtScaleDraw или внутри Оси уже есть функция, которую я только пропустил?


РЕДАКТИРОВАТЬ:

Я думаю, что проблема в моем смещении. Я вычесть это значение непосредственно из исходного значения внутри функции Метка QwtText (значение qreal) const моей собственной реализации QwtScaleDraw. Таким образом, ноль для отображения в этом примере — значение 1000. Может быть, лучше так установить смещение по-другому?

0

Решение

Я нашел решение:

Создать собственный класс наследовать QwtLinearScaleEngine. Добавить новую переменную-член смещение и добавить геттер / сеттер. Переписать функцию 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);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector