4

私のアプリケーションでは、QChart折れ線グラフを表示するために使用します。残念ながら、Qt Charts は、マウス ホイールを使用したズームやマウスによるスクロールなどの基本的な機能をサポートしていません。はい、RubberBand 機能はありますが、スクロールなどはまだサポートされておらず、ユーザーにとってそれほど直感的ではありません。また、ある種のsetRubberBand(QChartView::HorizontalRubberBand)マウスホイールを使用して、x軸のみをスケーリングする必要があります。これまでのところ、飛び込んQChartViewだ後、次の回避策を使用しました。

class ChartView : public QChartView {
protected:
    void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE
    {
        QRectF rect = chart()->plotArea();            
        if(event->angleDelta().y() > 0)
        {
            rect.setX(rect.x() + rect.width() / 4);
            rect.setWidth(rect.width() / 2);                                   
        }
        else
        {
            qreal adjustment = rect.width() / 2;
            rect.adjust(-adjustment, 0, adjustment, 0);                    
        }            
        chart()->zoomIn(rect);
        event->accept();            
        QChartView::wheelEvent(event);
    }
}

それは機能しますが、ズームインしてからズームアウトしても同じ結果にはなりません。小さな偏差があります。chart()->plotArea()デバッグ後、 が常に同じ rect を返すことがわかったので、この回避策は役に立ちませんでした。

可視領域のみの矩形を取得する方法はありますか? または、QChartViewのマウスによるズーム/スクロールを行う方法を誰かが私に正しい解決策を教えてくれるかもしれませんか?

4

2 に答える 2

5

zoomIn()andを使用する代わりに、以下に示すようにzoomOut()使用できます。zoom()

class ChartView : public QChartView {
protected:
    void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE
    {
        qreal factor = event->angleDelta().y() > 0? 0.5: 2.0;
        chart()->zoom(factor);
        event->accept();
        QChartView::wheelEvent(event);
    }
};

zoomIn()とに関してzoomOut()は、それがどのような座標を参照しているかは明確ではありません。私はまだ投資しています。より多くの情報が得られたら、回答を更新します。

アップデート:

私が観察したように、問題の1つは浮動小数点の乗算であり、もう1つは図の中心を見つけることです。これらの問題を避けるために、私の解決策はズームをリセットしてから変更を設定します:

class ChartView : public QChartView {
    qreal mFactor=1.0;
protected:
    void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE
    {
        chart()->zoomReset();

        mFactor *= event->angleDelta().y() > 0 ? 0.5 : 2;

        QRectF rect = chart()->plotArea();
        QPointF c = chart()->plotArea().center();
        rect.setWidth(mFactor*rect.width());
        rect.moveCenter(c);
        chart()->zoomIn(rect);

        QChartView::wheelEvent(event);
    }
};
于 2018-02-05T16:09:15.343 に答える