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にした場合こんな感じになる