Kohshi's Blog
2013/12/12
QCustomPlotがいい感じ
最近色々な機会で[Qt](http://qt-project.org/)を使う機会が増えたんだが、 いろいろ使ってるうちに手軽にグラフを描画したいケースがけっこうでてきた。 これまでは[QWT](http://qwt.sourceforge.net/)を使っていたんだが、 単純な棒グラフ作るだけでもわりと手続きが多くてめんどくさいのが難点。 あとドキュメントもいまいち。 で、代わりを探してみると[QCustomPlot](http://www.qcustomplot.com)っていうのを 最近よく見かけるようになってて、わりと評判もよさそうなんで使ってみた。 準備としては[QCustomPlot](http://www.qcustomplot.com)にアクセスしてDownloadのページから 最新のパッケージをダウンロードし、その中から * qcustomplot.h * qcustomplot.cpp を持ってきてプロジェクトに追加するだけ。 まず、Qt Designerでグラフを表示させたい箇所にWidget(QWidget)を配置。 配置したら、右クリックして格上げ先を指定を選択↓
格上げ先にQCustomPlotとqcostomplot.hを指定して「追加」を押し
追加されたQCustomPlotを選択して「格上げ」。
名前を例えばhistogramとかにしてDesignerでの作業は完了。
例えばヒストグラムを表示させたい場合にはQCPBarsを使う クラスメンバにQCPBars(QCPBars *mpHistogramBars)を追加し、コンストラクタでのように初期化する。 ```cpp: MainWindow.h namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; }; ``` ```cpp: MainWindow.cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); mpHistogramBars = new QCPBars(ui.histogram->xAxis, ui.histogram->yAxis); mpHistogramBars->setPen(QPen(Qt::gray));// 色指定 mpHistogramBars->setBrush(QBrush(Qt::gray));// 色指定 ui.histogram->addPlottable(mpHistogramBars);// 追加 } ``` あとは、描画したいタイミングで以下のようにQVector
を使ってデータをセットする。 ```cpp: MainWindow.cpp void MainWindow::drawHistogram(const QImage &image){ QVector
keys(256); QVector
values(256); for(int i = 0; i < keys.size(); i++){ keys[i] = i; values[i] = 0; } for(int j = 0; j < image.height(); j++){ for(int i = 0; i < image.width(); i++){ QRgb rgb = image.pixel(i, j);// RGB -> Y int y = qBound(0, (int)(0.299 * qRed(rgb) + 0.587 * qGreen(rgb) + 0.114 * qBlue(rgb) + 0.5), 255); values[y] += 1.0; } } mpHistogramBars->setData(keys, values); ui.histogram->rescaleAxes(); ui.histogram->replot(); } ``` QCustomPlotでは基本的にデータはdoubleで指定するもよう。 実行すると以下のような感じのヒストグラムが表示される。 (ただし、グラフ中の赤丸と座標点は表示されない。結構グラフを表示した後にマウスホバーで値を見たい場合はあるので、これの表示の仕方はまた別途)
結構見栄えがいい。 複数表示もいい感じにできます。
QWTだとsetIntervalだとか結構わかりにくいコードをいっぱいかかないといけなかった・・。 それとくらべてQCustomPlotは直感的でわかりやすいし、簡単! 次はQItemTracerでマウスホバーのやり方でもまとめる予定。
ツイート
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿