Я не могу найти события прокрутки колеса мыши для масштабирования графики в QChartView

У меня есть QChartView в окне программы. Есть массивы данных, которые корректно отображаются на графике как QLineSeries (кривые зависимости температуры от времени). Я не могу найти события колесика мыши для «увеличения масштаба колесика мыши» и «уменьшения масштаба колесика мыши» в QChartView? Нужна возможность масштабирования только по вертикали, как setRubberBand(QChartView::VerticalRubberBand), но только с помощью колесика мыши. Нужна помощь


person Joan Cornela    schedule 08.08.2018    source источник
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
comment
Большое спасибо, @eyllanesc !!! Преобразовал QWidget в форме в ChartView и использовал ваш модифицированный класс. Оно работает! :) Но действие MousewheelUp выполняет действие уменьшения, а не увеличения. Спасибо, в любом случае! :) - person Joan Cornela; 09.08.2018
comment
@JoanCornela изменить только на const qreal factor = 1/1.001; - person eyllanesc; 09.08.2018

QChartView наследуется от QGraphicsView, который предлагает QGraphicsSceneWheelEvent

person Mailerdaimon    schedule 09.08.2018