Kohshi's Blog
2014/03/08
QCustomPlotで表示したグラフをマウスホイールズームやDragシフトする際の範囲を制限する
[QCustomPlotでマウスホイールズーム&Dragでシフト](http://kohshi.blogspot.jp/2014/03/qcustomplotdrag.html)で紹介したようにほんの数行加えるだけで、 表示領域を操作できるのだが、0原点だけはズームやシフトしたい場合にも固定したい場合は結構多い。 そういう時はどういう風にするかを紹介する。 [ここ](http://www.qcustomplot.com/index.php/support/forum/289)で書かれている内容だが、 まず、制限したいQCPAxisのrangeChangedシグナルにslotを接続する↓。 ```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);// 追加 ui.histogram->setInteraction(QCP::iRangeDrag, true); ui.histogram->setInteraction(QCP::iRangeZoom, true); ui.histogram->axisRect()->setRangeDrag(Qt::Vertical); ui.histogram->axisRect()->setRangeZoom(Qt::Vertical); // yAxisRangeChanged()はslot connect(ui.histogram->yAxis, SIGNAL(rangeChanged(const QCPRange &)), this, SLOT(yAxisRangeChanged(const QCPRange &))); } ``` のようにしておいてRangeが変わったら、すなわちズームやシフトが発生したらyAxisRangeChangedが呼ばれるようにしておき、 yAxisRangeChangedの中で以下のようにRangeを再セットしてやる。 ```cpp void MainWindow::yAxisRangeChanged(const QCPRange &newRange) { ui.histogram->yAxis->setRange(0, ui.histogram->yAxis->range().upper);// y軸の下限を0に固定 } ``` 当然、マイナスの値にはしたくないという制限の場合には以下のようになる。 ```cpp void MainWindow::yAxisRangeChanged(const QCPRange &newRange) { if(newRange.lower < 0){ ui.histogram->yAxis->setRange(0, ui.histogram->yAxis->range().upper); } } ``` 常に下限を0にした場合こんな感じになる
ツイート
2014/03/07
QCustomPlotでマウスホイールズーム&Dragでシフト
あんまり簡単なんで書くのもなんなのだが・・・。 ```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);// 追加 // 以下を追加する事でマウスホイールズームとDragでシフトができるようになる ui.histogram->setInteraction(QCP::iRangeDrag, true); ui.histogram->setInteraction(QCP::iRangeZoom, true); // 例えばさらに垂直方向(y軸方向)だけズームやシフトすると制限する事も可能 ui.histogram->axisRect()->setRangeDrag(Qt::Vertical); ui.histogram->axisRect()->setRangeZoom(Qt::Vertical); } ``` これだけでマウスホイールズームとDragでのシフトができるようになる。 こんな感じ
[次回](http://kohshi.blogspot.jp/2014/03/qcustomplotdrag_8.html)ではシフト・ズーム範囲を制限してみる。
ツイート
新しい投稿
前の投稿
ホーム
登録:
投稿 (Atom)