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

时间:2018-02-05 13:23:40

标签: c++ qt qt5 qtchart

在我的应用程序中,我使用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 个答案:

答案 0 :(得分:3)

您可以使用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);
    }
};

答案 1 :(得分:0)

我使用以下代码对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());}