c++qtqt5qtchartsqchartview

I can't find mouse wheel scroll events for zoom graphics in QChartView


I have QChartView on the program window. There are arrays of data that correctly shown on chart as QLineSeries (curves of temperature vs time). I can't find mousewheel events for 'mousewheelup zoom-in' and 'mousewheeldown zoom-out' on QChartView? Need ability to zoom by only vertical direction, like a setRubberBand(QChartView::VerticalRubberBand) but only by mousewheel scroll. Need help


Solution

  • QChartView is a QWidget so you could implement that logic using the wheelEvent() method:

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