#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);
}
}