У меня есть QChartView в окне программы. Есть массивы данных, которые корректно отображаются на графике как QLineSeries (кривые зависимости температуры от времени). Я не могу найти события колесика мыши для «увеличения масштаба колесика мыши» и «уменьшения масштаба колесика мыши» в QChartView? Нужна возможность масштабирования только по вертикали, как setRubberBand(QChartView::VerticalRubberBand)
, но только с помощью колесика мыши. Нужна помощь
Я не могу найти события прокрутки колеса мыши для масштабирования графики в QChartView
comment
Всем нужна помощь, ибо это ТАК. На вопрос, в котором показано, что уже пробовали, обычно есть лучшие ответы, поэтому я рекомендую вам показать свою попытку решения.
- person eyllanesc   schedule 09.08.2018
comment
Проблема в том, что я нигде не нашел такого сигнала. Я пытался использовать chrt = new QChart; chrt-›легенда()-›скрыть(); ui-›vchrt-›setChart(chrt); ui-›vchrt-›setRubberBand(QChartView::VerticalRubberBand); Масштаб работает, но его необходимо увеличивать и уменьшать с помощью событий прокрутки колесика мыши. Я искал документацию, но не нашел этих сигналов.
- person Joan Cornela   schedule 09.08.2018
Ответы (2)
QChartView
— это QWidget
, поэтому вы можете реализовать эту логику с помощью метода wheelEvent()
:
#include <QApplication>
#include <QChartView>
#include <QLineSeries>
#include <random>
QT_CHARTS_USE_NAMESPACE
class ChartView : public QChartView
{
public:
using QChartView::QChartView;
enum DirectionZoom{
NotZoom,
VerticalZoom,
HorizontalZoom,
BothDirectionZoom = VerticalZoom | HorizontalZoom
};
DirectionZoom directionZoom() const{
return mDirectionZoom;
}
void setDirectionZoom(const DirectionZoom &directionZoom){
mDirectionZoom = directionZoom;
}
protected:
void wheelEvent(QWheelEvent *event)
{
if(chart() && mDirectionZoom != NotZoom){
const qreal factor = 1.001;
QRectF r = chart()->plotArea();
QPointF c = r.center();
qreal val = std::pow(factor, event->delta());
if(mDirectionZoom & VerticalZoom)
r.setHeight(r.height()*val);
if (mDirectionZoom & HorizontalZoom) {
r.setWidth(r.width()*val);
}
r.moveCenter(c);
chart()->zoomIn(r);
}
QChartView::wheelEvent(event);
}
private:
DirectionZoom mDirectionZoom = NotZoom;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QChart *chart = new QChart();
chart->legend()->hide();
chart->setTitle("Simple line chart example");
std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> uni(0, 10);
for(size_t i=0; i< 5; i++){
QLineSeries *series = new QLineSeries();
for(size_t j=0; j < 10; j++){
*series << QPointF(j, uni(rng));
}
chart->addSeries(series);
}
chart->createDefaultAxes();
ChartView chartView(chart);
chartView.setDirectionZoom(ChartView::VerticalZoom);
chartView.setRenderHint(QPainter::Antialiasing);
chartView.resize(640, 480);
chartView.show();
return a.exec();
}
person
eyllanesc
schedule
09.08.2018
Большое спасибо, @eyllanesc !!! Преобразовал QWidget в форме в ChartView и использовал ваш модифицированный класс. Оно работает! :) Но действие MousewheelUp выполняет действие уменьшения, а не увеличения. Спасибо, в любом случае! :)
- person Joan Cornela; 09.08.2018
@JoanCornela изменить только на
const qreal factor = 1/1.001;
- person eyllanesc; 09.08.2018
QChartView
наследуется от QGraphicsView
, который предлагает QGraphicsSceneWheelEvent
person
Mailerdaimon
schedule
09.08.2018