【问题标题】:QCharts Crop to Rectangle and Use Horizontal ScrollQCharts 裁剪为矩形并使用水平滚动
【发布时间】:2020-01-29 06:10:28
【问题描述】:

我正在尝试从 QtCharts Callout 示例中实现自定义图表。我想将图表的选择限制在特定区域,并使其可以水平滚动,同时仍显示轴值。

我正在使用的课程如下

callout.cpp

callout.h

main.cpp

view.cpp

view.h

这是我的意思的一个例子

说我想要选择区域 point1 = (5,0) point2 = (15,8) 并且该区域是 QRect(point1,point2)

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

【问题讨论】:

  • 选择是什么意思?您的意思是用户手动执行此操作,或者只是创建一个执行此操作的方法。水平滚动是什么意思?你想要滚动条还是只是拖动鼠标?
  • 我只想创建一个方法来完成它。只需拖动鼠标即可。

标签: qt qt5 qtcharts qchart qchartview


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2012-02-11
    • 2014-02-03
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多