使用鼠标滚轮缩放QChartView的x轴

5
在我的应用程序中,我使用QChart来显示折线图。不幸的是,Qt Charts不支持使用鼠标滚轮进行缩放和使用鼠标滚动的基本功能。是的,有RubberBand功能,但是它仍然不支持滚动等功能,而且对用户来说不够直观。此外,我需要只缩放x轴,类似于setRubberBand(QChartView::HorizontalRubberBand),但要使用鼠标滚轮。
到目前为止,在深入研究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()总是返回相同的矩形,所以这种解决方法是无用的。

是否有一种方法只获取可见区域的矩形呢? 或者有人能指点我如何通过鼠标对QChartView进行缩放/滚动的正确解决方案吗?

2个回答

5

与其使用zoomIn()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(),不清楚它是指什么类型的坐标,我还在进行调查。当我有更多信息时,我会更新我的答案。

更新:

我观察到问题之一是浮点数的乘法,另一个问题是确定图形的中心位置,为了避免这些问题,我的解决方案是重置缩放然后设置变化:

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

谢谢你的回答。我忘记提到了,我只需要x轴的缩放。所以在这里缩放不是很有用。我需要一些类似于setRubberBand(QChartView::HorizontalRubberBand)但使用鼠标滚轮的方式。 - folibis
@folibis 我已经添加了一个新的解决方案。 :D - eyllanesc
很好的解决方案,@eyllanesc!谢谢!这对我非常有帮助。到目前为止,我发现另一个解决方案只是对QChartPrivate::zoomIn()进行了小的更正,即删除高度缩放,但这需要创建自定义类继承自QChart。你的解决方案更加优雅。 - folibis

2
我用以下代码实现了x轴和y轴缩放:

我用以下代码实现了x轴和y轴缩放:

void wheelEvent(QWheelEvent *event){
qreal factor;
if ( event->delta() > 0 )
    factor = 2.0;
else
    factor = 0.5;

QRectF r = QRectF(chart()->plotArea().left(),chart()->plotArea().top(),
                                    chart()->plotArea().width()/factor,chart()->plotArea().height()/factor);
QPointF mousePos = mapFromGlobal(QCursor::pos());
r.moveCenter(mousePos);
chart()->zoomIn(r);
QPointF delta = chart()->plotArea().center() -mousePos;
chart()->scroll(delta.x(),-delta.y());}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接