2014/03/08

QCustomPlotで表示したグラフをマウスホイールズームやDragシフトする際の範囲を制限する

QCustomPlotでマウスホイールズーム&Dragでシフトで紹介したようにほんの数行加えるだけで、 表示領域を操作できるのだが、0原点だけはズームやシフトしたい場合にも固定したい場合は結構多い。

そういう時はどういう風にするかを紹介する。

ここで書かれている内容だが、
まず、制限したいQCPAxisのrangeChangedシグナルにslotを接続する↓。

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を再セットしてやる。

void MainWindow::yAxisRangeChanged(const QCPRange &newRange)
{
    ui.histogram->yAxis->setRange(0, ui.histogram->yAxis->range().upper);// y軸の下限を0に固定
}


当然、マイナスの値にはしたくないという制限の場合には以下のようになる。

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でシフト

あんまり簡単なんで書くのもなんなのだが・・・。

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でのシフトができるようになる。
こんな感じ

次回ではシフト・ズーム範囲を制限してみる。