Qtでグラフ描画

Qwtのインストール

計測系のプログラムなどでグラフを表示したいとことは多い。QtのGUI向けにQwtというグラフ表示ライブラリがあるので使ってみる。無料。
公式サイト
ここからQwt6をダウンロードする。それでsrcディレクトリにあるproファイルからQt Creatorでコンパイルする。できたsrcバイナリのあるディレクトリでmake installするとインストール完了。

sin波を表示する

適当にプロジェクトを作って、Plotというクラスを追加する。

ここでQwtPlotを継承することに注意。
コンパイルできるようにQwtの場所をQt Creatorに教える。これは.proファイルに

LIBS += -L/usr/local/qwt-6.0.0-rc5/lib \
    -lqwt
INCLUDEPATH += /usr/local/qwt-6.0.0-rc5/include

と入れる。
それで、GUIのデザイン画面でWidgetをPlotに格上げする。
ここからが肝心のグラフの調整。
plot.h

#ifndef PLOT_H
#define PLOT_H

#include <qwt_plot.h>

class QwtPlotCurve;

class Plot : public QwtPlot
{
    Q_OBJECT
public:
    explicit Plot(QWidget *parent = 0);

private:
    void plotCurve();
    QwtPlotCurve *curve1_;
};

#endif // PLOT_H

plot.cpp

#include "plot.h"
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <qwt_plot_grid.h>

Plot::Plot(QWidget *parent) :
    QwtPlot(parent)
{
    setTitle("sine");
    setCanvasBackground(QColor(Qt::white));
    // 凡例
    insertLegend(new QwtLegend(), QwtPlot::BottomLegend);

    // グリッド
    QwtPlotGrid *grid1 = new QwtPlotGrid;
    grid1->enableXMin(true);
    grid1->setMajPen(QPen(Qt::black, 0, Qt::DashDotLine));
    grid1->setMinPen(QPen(Qt::gray, 0 , Qt::DotLine));
    grid1->attach(this);

    // 曲線の設定
    curve1_ = new QwtPlotCurve("sine wave");
    curve1_->setRenderHint(QwtPlotItem::RenderAntialiased);
    curve1_->setPen(QPen(Qt::red));
    curve1_->attach(this);

    // 軸
    setAxisTitle(QwtPlot::xBottom, "x");
    setAxisTitle(QwtPlot::yLeft, "y");

    // 曲線の描画
    plotCurve();
}

void Plot::plotCurve()
{
    const int kArraySize = 1000;

    double x[kArraySize] = {}; // x
    double y[kArraySize] = {}; // y

    for (int i = 0; i < kArraySize; ++i) {
        x[i] = i/(kArraySize-1.0);
        y[i] = sin(2.0*M_PI*x[i]);
    }

    curve1_->setSamples(x, y, kArraySize);
}

実行するとこんな感じ。

うちの環境の場合soファイルがないと怒られたので、
/etc/ld.so.conf

/usr/local/qwt-6.0.0-rc5/lib
と書いてsudo ldconfigを実行した。
グラフが描けるといろいろ遊べそう。

追加(2011/12/13)
Windows 7 x64の場合
Qwtのサイトからqwt-6.0.1をダウンロードして解凍する。
qwt.proがあるので、Visual Studioのアドインから開いてコンパイルする。
そうするとlibフォルダができて、qwt.lib、qwt.exp、qwt.dllが生成される。
それでexampleフォルダにあるソースが、実行できるようになったはず。
新しいプロジェクトの場合、
追加のインクルードディレクトリに qwt-6.0.1\src
追加のライブラリディレクトリに qwt-6.0.1\lib
C/C++プリプロセッサの定義に QWT_DLL
を入力する。