Как ограничить масштабирование в QtCharts?

#c #qt #plot

#c #qt #график

Вопрос:

Я реализовал пример масштабирования изhttp://doc.qt.io/qt-5/qtcharts-zoomlinechart-example.html

Теперь мне нужно ограничить масштабирование. У меня есть две оси Y со значениями от -100 до 100 (или даже больше), другая ось y2 фиксирована на -pi .. pi (никаких значений за пределами этого диапазона)

Масштабирование не должно превышать границ диапазонов данных, или, по крайней мере, пределы должны быть заданными.

Итак, как я могу это реализовать? Я пока не нашел дополнительных примеров для QtCharts.

Также я хотел бы сбросить масштаб до исходного, скажем, с помощью Backspace. Как бы мне сбросить масштаб?

Комментарии:

1.общее предположение, но может быть:doc.qt.io/qt-5/qvalueaxis.html doc.qt.io/qt-5/qvalueaxis.html#setRange

2. Хорошо, но как я могу проверить диапазон? Как я могу получить доступ к оси, если у меня есть только диаграмма как объект? Как мне определить, что происходит масштабирование?

3. Есть rangeChanged(qreal min, qreal max) сигнал, который я мог бы поймать, но где я могу его подключить?

4. к сожалению, у меня очень мало знаний о QT. Эти ссылки были просто тем, что я нашел в 30-х годах в Google.

5. После того, как вы вызовете void QChart::ZoomIn, не могли бы вы просто проверить ось и настроить их по мере необходимости? Или даже не используйте ZoomIn, просто отрегулируйте диапазон вручную.

Ответ №1:

Поздний ответ, но поскольку других нет..

В MyChartView : public QtCharts::QChartView классе я переопределяю mouseReleaseEvent этот метод. При щелчке правой кнопкой мыши ось будет немедленно «уменьшена» до значения по умолчанию (чего я и хочу).

В случае, если уменьшение масштаба должно поддерживаться поэтапно, я полагаю, можно подключиться к QValueAxis::maxChanged / QValueAxis::minChanged и проверить диапазон там.

 void MyChartView::mouseReleaseEvent(QMouseEvent *event) {
   if (event->button() == Qt::MouseButton::LeftButton) {
       // continue with zoom in
        QtCharts::QChartView::mouseReleaseEvent(event);
   }
   else if (event->button() == Qt::MouseButton::RightButton) {
      // reset axis to default
      axisY_->setMin(0);
      axisY_->setMax(10);
      axisX_->setMin(0);
      axisX_->setMax(10);
   }
}