首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QCharts裁剪为矩形并使用水平滚动

QCharts裁剪为矩形并使用水平滚动
EN

Stack Overflow用户
提问于 2020-01-29 06:10:29
回答 1查看 383关注 0票数 2

我试图从QtCharts标注示例中实现一个自定义图形。我希望将图表的选择限制在特定区域,并使其能够在水平滚动的同时仍然显示轴值。

我正在使用的类如下

callout.cpp

callout.h

main.cpp

view.cpp

view.h

下面是我的意思的一个例子

假设我想要选择区域point1 = (5,0) point2 = (15,8),区域是一个QRect(point1,point2)

图形中的所有点都应该被渲染,但我希望能够横向滚动并保持y_axis在视图中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-30 05:39:46

一种可能的解决方案是覆盖mousePressEvent和mouseMoveEvent方法以应用滚动,并在必要时使用轴范围进行更正:

代码语言:javascript
运行
AI代码解释
复制
#include <QtWidgets>
#include <QtCharts>

#include <algorithm>

QT_CHARTS_USE_NAMESPACE

class ChartView: public QChartView{
public:
    using QChartView::QChartView;
    void setRange(qreal xmin, qreal xmax, qreal ymin, qreal ymax){
        if(!chart()) return;
        if(QValueAxis *xaxis = qobject_cast<QValueAxis *>(chart()->axes(Qt::Horizontal).first())){
            xaxis->setRange(xmin, xmax);
        }
        if(QValueAxis *yaxis = qobject_cast<QValueAxis *>(chart()->axes(Qt::Vertical).first())){
            yaxis->setRange(ymin, ymax);
        }
    }
    void setLimits(qreal min, qreal max, Qt::Orientation orientation){
        m_limit_min = min;
        m_limit_max = max;
        m_orientation = orientation;
    }
protected:
    void mousePressEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton && chart())
            m_lastMousePos = mapToScene(event->pos());
        QGraphicsView::mousePressEvent(event);
    }
    void mouseMoveEvent(QMouseEvent *event)
    {
        if(event->buttons() & Qt::LeftButton && chart()){
            QPointF newValue = mapToScene(event->pos());
            QPointF delta = newValue - m_lastMousePos;
            if(m_orientation == Qt::Horizontal)
                chart()->scroll(-delta.x(), 0);
            else
                chart()->scroll(0, -delta.y());
            if(QValueAxis * axis = qobject_cast<QValueAxis *>(chart()->axes(m_orientation).first()) ){
                qreal deltaX = axis->max() - axis->min();
                if(axis->min() < m_limit_min){
                    axis->setRange(m_limit_min, m_limit_min + deltaX);
                }
                else if(axis->max() > m_limit_max){
                    axis->setRange(m_limit_max - deltaX, m_limit_max);
                }
            }
            m_lastMousePos = newValue;
        }
        QGraphicsView::mouseMoveEvent(event);
    }
private:
    QPointF m_lastMousePos;
    qreal m_limit_min;
    qreal m_limit_max;
    Qt::Orientation m_orientation;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ChartView chartView;
    chartView.setRenderHint(QPainter::Antialiasing);
    chartView.resize(640, 480);

    QLineSeries *series = new QLineSeries();
    series->append(0, 6);
    series->append(2, 4);
    series->append(3, 8);
    series->append(7, 4);
    series->append(10, 5);
    *series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);
    QChart *chart = chartView.chart();
    chart->legend()->hide();
    chart->addSeries(series);
    chart->createDefaultAxes();
    chartView.show();

    chartView.setRange(5, 15, 0, 8);
    chartView.setLimits(0, 20, Qt::Horizontal);

    return a.exec();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59961372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档