• Qt QChart使用指南


    问题1:如何在设计界面中添加QCharView控件?

    1 首先在项目配置文件添加 charts 模块     Qt += charts
    2 打开设计界面,将 Widget 容器,拖动到界面上,鼠标右击 Widget 容器,选择提升的窗口部件,选择基类名称 QWidget,提示的类名称 输入QChartView, 点击添加。
    3 选中QChartView,点击提升,此时原QWidget控件就会变为QCharView控件。
    4 在项目头文件中中导入QtCharts    #include <QtCharts> 

    问题2:QChart的组成部分

    1 QChart主要由一下几个大类组成:QChartView类、QChart类、QAbstractSeries类、QValueAxis类
    2 QChartView类 为画布对象,   
    3 QChart类是真正的图表对象,不过QChart需要添加在QChartView对象下才可在正确展示出来
    4 QAbstractSeries类是数据集合,主要子类为QLineSeries——折现类,在QChart中添加QAbstractSeries,才可以展示出数据,否则QChart只能展现坐标轴
    5 QValueAxis类是坐标轴类,用来设置QChart类的坐标轴属性,包括范围、精度等,也用来将QAbstractSeries类与QChart类对应起来。    

    简单QChart实现

     1 // widget.h 
     2     QChartView * MyChartView;   // 画布对象
     3     QChart MyChart;             // 图表对象
     4     QLineSeries MyLineSeries;   // 展示在图表对象上面的线对象
     5     QVector<QPointF> MyPointf;  // 绘制线对象所需要的数据
     6     QValueAxis MyAxisX;         // X轴
     7     QValueAxis MyAxisY;         // Y轴
     8 
     9 // widget.cpp 构造函数
    10     // 1.获取画布
    11     MyChartView = ui->widget;
    12     // 2.展示坐标对象(将坐标对象放到画布上)
    13     MyChartView->setChart(&MyChart);
    14     // 3.给序列对象添加数据
    15     for(int i = 0; i < 100; i ++)
    16     {
    17         MyPointf << QPointF(i,i);
    18     }
    19     MyLineSeries.replace(MyPointf);
    20     // 4.将序列添加到坐标对象中
    21     MyChart.addSeries(&MyLineSeries);

    效果展示

    QChartView类方法

    1 // 1.通过鼠标左键选中矩形,来放大这个矩形,同时鼠标右键,具备缩小图的功能
    2 void QChartView::setRubberBand(const QChartView::RubberBands &rubberBand)

    QChart类方法

     1 // 1.添加自定义坐标轴        Qt::AlignLeft 左侧X轴    Qt::AlignBottom 下端Y轴
     2 void addAxis(QAbstractAxis *axis, Qt::Alignment alignment)    
     3 // 2.设置默认坐标轴(QChart为根据系列上的数据,创建合适的坐标轴,数据中最小/最大的x值为坐标的x的范围,数据中最小/最大的y值为坐标的y的范围)
     4 void createDefaultAxes()
     5 // 3.移除坐标轴
     6 void removeAxis(QAbstractAxis *axis)    
     7 // 3.添加单个系列
     8 void addSeries(QAbstractSeries *series)    
     9 // 4.移除单个系列
    10 void QChart::removeSeries(QAbstractSeries *series)
    11 // 5.移除全部系列
    12 void QChart::removeAllSeries() 
    13 // 6.平移
    14 void scroll(qreal dx, qreal dy)
    15 // 7.设置外边距,通过设置负数可以是图表外面的空白减小   QMargins m(-10,-10,-10,-10);
    16 void setMargins(const QMargins &margins)
    17 // 8.设置图表绘制的位置,注意:不包含坐标轴     QRectF r(0,0,600,400);   此时将看不到Y轴坐标轴
    18 void setPlotArea(const QRectF &rect)
    19 // 9.设置标题
    20 void setTitle(const QString &title)
    21 // 9.1设置绘制标题的画刷
    22 void setTitleBrush(const QBrush &brush)
    23 // 9.2设置标题的字体 
    24 void setTitleFont(const QFont &font)
    25 // 10.放大/缩小坐标轴的范围   以图表的中心点开始放大/缩小
    26 void zoom(qreal factor)
    27 // 11.获取图表的图例,即系列的名称    通过 QLegend.hide() 可隐藏图表中所有的图例   
    28 QLegend *QChart::legend() const    

    QAbstractSeries类下的QXYSeries方法

     1 QAbstractSeries为系列的基类,其下又分为 QXYSeries类(折线图、样条曲线图、散点图的基类)、QPieSeries类(饼状图)、QAbstractBarSeries类(条状图)等
     2 -QAbstractSeries
     3 ---QXYSeries
     4 -----QLineSeries 折线图
     5 -------QSplineSeries样条曲线图    // 相比较于QLineSeries,更加平滑,同时更加耗时,大概为2.5倍时间,不过总时间很小(10000个点0.3ms),基本可忽略    
     6 -----ScatterSeries 散点图    
     7 ---QPieSeries
     8 ---QAbstractBarSeries    
     9     
    10 方法:
    11 // 1.1 添加单个数据 不推荐        
    12 void append(qreal x, qreal y)
    13 // 1.2 添加单个数据 不推荐        
    14 void append(const QPointF &point)
    15 // 1.3 添加多个数据 不推荐        
    16 void append(const QList<QPointF> &points)
    17 // 1.4 替换单个数据 不推荐   
    18 void replace(qreal oldX, qreal oldY, qreal newX, qreal newY)
    19 // 1.5 替换多个数据 不推荐     
    20 void replace(QList<QPointF> points)
    21 // ***1.6 替换多个数据 极力推荐     (使用replace时,将不需要使用clear())
    22 void replace(QVector<QPointF> points)
    23 // 2 在系列中根据索引获取坐标
    24 const QPointF &at(int index) const
    25 // 3 插入某个点   
    26 void insert(int index, const QPointF &point)
    27 // 4 获取画刷 
    28 QBrush brush() const
    29 // 5 清空
    30 void clear()
    31 // 6 获取颜色   折线图、样条曲线图的线条颜色  散点图的填充颜色
    32 virtual QColor color() const
    33 // 7 获取点的数量
    34 int count() const
    35 // 8 获取绘制轮廓的笔
    36 QPen pen() const
    37 // 9 获取所有点
    38 QVector<QPointF> pointsVector() const
    39 // 10 该系列点是否绘制(是否可见)   注意:设置为false时,看不见凸出的点,但是线仍然可以看见
    40 bool pointsVisible() const
    41 // 11 设置绘制点的画刷
    42 virtual void setBrush(const QBrush &brush)
    43 // 12 设置绘制点的笔
    44 virtual void setPen(const QPen &pen)    
    45 // 13 设置绘制线的画刷  折线图、样条曲线图的线条颜色  散点图的填充颜色
    46 virtual void setColor(const QColor &color)
    47 // 14.1 设置点的标签,每个点都会被设置
    48 void setPointLabelsFormat(const QString &format)
    49 // 14.2 设置裁剪,超过图表区域部分会被裁剪
    50 void setPointLabelsClipping(bool enabled = true)
    51 // 14.3 设置点的标签的颜色
    52 void setPointLabelsColor(const QColor &color)
    53 // 14.4 设置点的标签的字体
    54 void setPointLabelsFont(const QFont &font)
    55 // 14.5 设置点的标签的可见
    56 void setPointLabelsVisible(bool visible = true)
    57 // 15 绑定坐标轴  需要连续绑定X轴、Y轴,而且要与QChart绑定同一组坐标轴
    58 bool QAbstractSeries::attachAxis(QAbstractAxis *axis)  

    QValueAxis类方法

     1 // 1 设置范围
     2 void setRange(qreal min, qreal max)
     3 void setMax(qreal max)
     4 void setMin(qreal min)    
     5 // 2 设置网格划分类型      QValueAxis::TicksDynamic 按固定值划分  QValueAxis::TicksFixed  按份来划分(默认)
     6 void setTickType(QValueAxis::TickType type); 
     7 // 3 设置主要刻线线  设置为11,则按范围等分为10份, 在 QValueAxis::TicksFixed 时生效
     8 void setTickCount(int count)
     9 // 4 设置次要刻线, 设置为6,即给每个主刻度线在等分为5份  共 10 * 5 50份   在 QValueAxis::TicksFixed 时生效
    10 void setMinorTickCount(int count)
    11 // 5 按值设置刻度线,每两条刻度线间隔的值为设置的值,在 QValueAxis::TicksDynamic 时生效
    12 void setTickInterval(qreal insterval)   
    13 // 6 隐藏刻度线 
    14 void QAbstractAxis::hide()    
    15 // 7 设置主要刻度线的颜色
    16 void setGridLineColor(const QColor &color)
    17 // 8 设置主要刻度线的画笔
    18 void setGridLinePen(const QPen &pen)
    19 // 9 设置主要刻度线的可见性
    20 void setGridLineVisible(bool visible = true)
    21 // 10 设置轴线的颜色
    22 void setLinePenColor(QColor color)
    23 // 11 设置轴线的可见性
    24 void setLineVisible(bool visible = true)
    25 // 12 设置标题
    26 void setTitleText(const QString &title)
    27 void setTitleFont(const QFont &font)
    28 void setShadesColor(QColor color)
    29 void setShadesPen(const QPen &pen)
    30 void setShadesBrush(const QBrush &brush)
    31 void setTitleVisible(bool visible = true)
    32 // 13 设置标签
    33 void setLabelsAngle(int angle)
    34 void setLabelsColor(QColor color)
    35 void setLabelsFont(const QFont &font)
    36 void setLabelFormat(const QString &format)      // ("%d")  %d为十进制显示   

    问题3:如何刷新QChart?

    1 // 1.更新坐标点
    2 // 2.更新系列中的数据  注意:不需要将该系列从图表中移除
    3 MyPointf.clear();
    4 for(int i = 0; i < 10000; i ++)
    5 {
    6     MyPointf << QPointF(i,i + QRandomGenerator::global()->bounded(0,10));
    7 }
    8 MyLineSeries.replace(MyPointf);
    9 MySplineSeries.replace(MyPointf);

    问题4:如何设置固定的坐标轴?

     1 // 1.创建坐标轴,分X、Y轴
     2 // 2.设置坐标轴属性 范围、样式等
     3 // 3.给图表绑定坐标轴
     4 // 4.给系列绑定坐标轴  
     5 
     6 QValueAxis MyAxisX;         // X轴
     7 QValueAxis MyAxisY;         // Y轴
     8 
     9 MyAxisX.setRange(0,100);
    10 MyAxisY.setRange(0,100);
    11 
    12 MyChart.addAxis(&MyAxisX,Qt::AlignLeft);
    13 MyChart.addAxis(&MyAxisY,Qt::AlignBottom);
    14 
    15 MyLineSeries.attachAxis(&MyAxisX);
    16 MyLineSeries.attachAxis(&MyAxisY);
    17 MySplineSeries.attachAxis(&MyAxisX);
    18 MySplineSeries.attachAxis(&MyAxisY);
  • 相关阅读:
    LeetCode 17. Letter Combinations of a Phone Number (电话号码的字母组合)
    Mordern Effective C++ --auto
    modern effective C++ -- Deducint Types
    基于锁的并发数据结构
    C++ 内存模型
    zlib 简单封装
    assert 实现分析
    Valgrind 快速入门
    kmp算法理解与记录
    make 要点简记
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/16466718.html
Copyright © 2020-2023  润新知