You can use QwtPlotIntervalCurve
:
#include <QtWidgets>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_intervalcurve.h>
#include <cmath>
static double f(double x, double A, double W, double B){
return A * std::sin(W * x) + B;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
const double deltax = .1;
const int size = 100;
QVector<QwtIntervalSample> rangeData(size);
QVector<QPointF> lowData(size);
QVector<QPointF> upperData(size);
for(int i=0; i <size; ++i){
double x = deltax * i;
double ylow = f(x, 1, 4, -10);
double yupper = f(x, 1, 2, 10);
lowData[i] = QPointF(x, ylow);
upperData[i] = QPointF(x, yupper);
rangeData[i] = QwtIntervalSample(x, QwtInterval(ylow, yupper));
}
QwtPlot plot;
QColor bg(Qt::gray);
bg.setAlpha(150);
QwtPlotCurve lowcurve;
lowcurve.setRenderHint( QwtPlotItem::RenderAntialiased );
lowcurve.setPen(QPen(Qt::gray, 5));
lowcurve.setSamples(lowData);
lowcurve.attach(&plot);
QwtPlotCurve uppercurve;
uppercurve.setRenderHint( QwtPlotItem::RenderAntialiased );
uppercurve.setPen(QPen(Qt::gray, 5));
uppercurve.setSamples(upperData);
uppercurve.attach(&plot);
QwtPlotIntervalCurve curve;
curve.setRenderHint( QwtPlotItem::RenderAntialiased );
curve.setPen(Qt::white);
curve.setBrush(bg);
curve.setStyle(QwtPlotIntervalCurve::Tube);
curve.setSamples( rangeData );
curve.attach(&plot);
plot.resize(640, 480);
plot.show();
return a.exec();
}
