Sur cette page

Exemple de ligne de zoom

Cet exemple montre comment créer votre propre effet de zoom personnalisé.

Cet exemple montre comment créer votre propre effet de zoom personnalisé avec l'QRubberBand, à l'aide d'une souris, et comment utiliser les gestes tactiles pour effectuer un panoramique et zoomer.

Capture d'écran présentant un exemple de graphique en vagues

Capture d'écran du graphique en vagues agrandi

Exécution de l’exemple

Vous pouvez exécuter l'exemple à partir de :

Personnalisation des effets de zoom

Commençons par créer une série de lignes avec des données d'exemple.

    auto series = new QLineSeries;
    for (int i = 0; i < 500; i++) {
        QPointF p((qreal) i, qSin(M_PI / 50 * i) * 100);
        p.ry() += QRandomGenerator::global()->bounded(20);
        *series << p;
    }

Ensuite, nous créons une vue de graphique personnalisée en dérivant de QChartView :

class ChartView : public QChartView

Nous redéfinissons la gestion des événements de souris et de clavier

protected:
    bool viewportEvent(QEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);

Nous implémentons ensuite une logique personnalisée pour les événements de souris et de clavier. Par exemple, appuyer sur la touche « + » effectuera un zoom avant et appuyer sur la touche « - » effectuera un zoom arrière.

void ChartView::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Plus:
        chart()->zoomIn();
        break;
    case Qt::Key_Minus:
        chart()->zoomOut();
        break;

Nous créons également notre propre QChart :

class Chart : public QChart

Dans lequel nous pouvons gérer les gestes :

bool Chart::sceneEvent(QEvent *event)
{
    if (event->type() == QEvent::Gesture)
        return gestureEvent(static_cast<QGestureEvent *>(event));
    return QChart::event(event);
}

bool Chart::gestureEvent(QGestureEvent *event)
{
    if (QGesture *gesture = event->gesture(Qt::PanGesture)) {
        auto pan = static_cast<QPanGesture *>(gesture);
        QChart::scroll(-(pan->delta().x()), pan->delta().y());
    }

    if (QGesture *gesture = event->gesture(Qt::PinchGesture)) {
        auto pinch = static_cast<QPinchGesture *>(gesture);
        if (pinch->changeFlags() & QPinchGesture::ScaleFactorChanged)
            QChart::zoom(pinch->scaleFactor());
    }

    return true;
}

Notez que vous devrez appeler la méthode `grabGesture()` à la fois sur ` QMainWindow ` et sur `QChart`.

Exemple de projet sur code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.