Beispiel einer Zoomlinie

Das Beispiel zeigt, wie Sie Ihren eigenen benutzerdefinierten Zoom-Effekt erstellen können.

Das Beispiel zeigt, wie Sie Ihren eigenen benutzerdefinierten Zoom-Effekt mit QRubberBand unter Verwendung einer Maus erstellen und wie Sie Touch-Gesten zum Schwenken und Zoomen verwenden können.

Ausführen des Beispiels

Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.

Anpassen von Zoomeffekten

Lassen Sie uns zunächst eine Linienreihe mit einigen Beispieldaten erstellen.

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

Dann erstellen wir eine benutzerdefinierte Diagrammansicht, indem wir von QChartView ableiten:

class ChartView : public QChartView

Wir überschreiben die Behandlung von Maus- und Tastenereignissen

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

Dann implementieren wir eine eigene Logik für Maus- und Tastenereignisse. Zum Beispiel wird durch Drücken der '+'-Taste die Ansicht vergrößert und durch Drücken der '-'-Taste verkleinert.

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

Wir erstellen auch unsere eigene QChart:

class Chart : public QChart

Hier können wir die Gesten verarbeiten:

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

Beachten Sie, dass Sie sowohl QMainWindow als auch QChart mit grabGesture() aufrufen müssen.

Beispielprojekt @ code.qt.io

© 2025 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.