#include "errorplotter.h" #include ErrorPlotter::ErrorPlotter(QWidget *parent) : QWidget(parent) , m_maxErrorValue(0.0) { } QSize ErrorPlotter::minimumSizeHint() const { return QSize(100, 100); } QSize ErrorPlotter::sizeHint() const { return QSize(400, 200); } void ErrorPlotter::clear() { m_errorValues.clear(); m_maxErrorValue = 0.0; update(); } void ErrorPlotter::addErrorValue(double errorValue) { if (m_errorValues.size() == m_bufferSize) { m_errorValues.pop_front(); } m_errorValues.push_back(errorValue); m_maxErrorValue = std::max(m_maxErrorValue, errorValue); update(); } void ErrorPlotter::paintEvent(QPaintEvent *) { if (m_errorValues.empty() || m_maxErrorValue == 0) { return; } QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.translate(0.0, height()); painter.scale(1.0, -1.0); double errorValueScale = height() / m_maxErrorValue; auto errorValueIt = m_errorValues.crbegin(); double prevErrorValue = *errorValueIt; errorValueIt++; int xPos = width() - 2; while(errorValueIt != m_errorValues.crend() && xPos >= 0) { double currentErrorValue = *errorValueIt; painter.drawLine(xPos + 1, prevErrorValue * errorValueScale, xPos, currentErrorValue * errorValueScale); prevErrorValue = currentErrorValue; errorValueIt++; xPos--; } }