Построение графиков (QT)

К сожалению, в QT нет удобного компонента TChart (от Borland, для Delphi/Builder). Но есть неплохая альтернатива - Qwt. Из добавлением графиков и гистограмм никаких проблем не должно возникать, а вот с bubbles иногда (в зависимости от задачи) могут возникнуть трудности. Но об этом не сейчас. Начнем с обычных графиков.

Для построения графика необходимо:

1. У визуальном редакторе добавить компонент QwtPlot на форму

2. На компонент QwtPlot можно вывести различные кривые (графики). Между версиями 5.* и 6.* Qwt существуют различия в создании кривых.

Класс, который позволяет строить кривые - QwtPlotCurve. Добавлять точки можно многими методами. Мы рассмотрим лишь некоторые.

Построение графиков в Qwt 5 подробно описано здесь: http://qtlinux.narod.ru/use_qwtplot.htm

В двух словах, сначала надо создать полигон точек, потом передать его у кривую, которую приаттачить к QwtPlot. Как-то так:

 
        #include "qwt_plot_curve.h"
        ...
        QwtPlotCurve *curve = new QwtPlotCurve;
        QPolygonF* polygon = new QPolygonF;
        for (float i=0; i<=30; i += 0.01)
           polygon->append(QPointF(i, sin(i)));
        curve->setData(*polygon);
        curve->attach(ui->qwtPlot);
        ui->qwtPlot->replot();
        

 

У Qwt 6 общая идея сохранилась, но вместо QPolygonF нужно использовать QVector<QPointF>:

#include "qwt_plot_curve.h"
......
QwtPlotCurve *curve = new QwtPlotCurve; 
QVector<QPointF>* vector = new QVector<QPointF>; 
for (float i=0; i<=30; i += 0.01) 
   vector->append(QPointF(i, sin(i))); 
curve->setSamples(*vector); 
curve->attach(ui->qwtPlot); 
ui->qwtPlot->replot();

Чтобы изменить цвет графика, нужно вызвать метод setPen, например вот так:

 

curve->setPen(QPen(QColor(int red, int green, int blue, int brightness)));

 

Так же можно закрашивать подграфик:

 

curve->setBrush(QBrush(QColor(int red, int green, int blue, int brightness)));

Так же можно задать стиль графика (по умолчанию точки графика соединяются линиями). Но возможны и другие варианты:

сurve->setStyle(QwtPlotCurve::Dots); //просто выводит точки
curve->setStyle(QwtPlotCurve::Steps); //строит "ступеньки"
curve->setStyle(QwtPlotCurve::Lines); //то самое умолчание

Разумеется, QwtPlotCurve понимает не только QPolygonF/QVector<QPointF> - можно передавать и указатели на X, Y и многие другие типы - здесь показаны только базовые примеры.

Примечание: При использовании Qwt 6 объект QwtPlotCurve нужно создавать только динамически - почему-то со статическим объектом не работает, хотя компилятор никаких ошибок не выдает...