QChart——折线

这篇具有很好参考价值的文章主要介绍了QChart——折线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qchart的图形显示依附于QChartView,创建一个QChartView继承类,通过窗口部件的提升进行图表的显示
添加了触摸屏的双指捏合的缩放(测试用,参数采用的固定值,没有做太多的处理)
一、简单认识QLineSeries
QLineSeries属于折线类,它继承于QXYSeries类,可以使用QXYSeries类所有方法,对折线进行属性设置
二、创建折线

 qsrand(QTime::currentTime().second());
    //创建折线数据
    for(int i = 0 ; i < 40;i++)
    {
        int value = (qrand() % 100);
        m_line->append(i, value);
    }

    //x轴显示范围
    m_X->setRange(0,20);

    //y轴显示范围
    m_Y->setRange(0,100);

    //添加坐标
    this->chart()->addAxis(m_X,Qt::AlignBottom);
    this->chart()->addAxis(m_Y,Qt::AlignLeft);

    //隐藏图例
    //this->chart()->legend()->hide();
    this->chart()->addSeries(m_line);

三、设置抗锯齿

setRenderHint(QPainter::Antialiasing);

四、设置缩放功能

//设置橡皮筋 用来图形缩放功能,右击缩放,左击拖拽放大(坐标系不会发生变化),如果需要坐标系同步变化需要对鼠标事件重写(待测试)
    setRubberBand(QChartView::VerticalRubberBand);

五、图例的简单设置
1、采用setAlignment函数设置图例的显示位置(只能在坐标系的四周显示)

this->chart()->legend()->setAlignment(Qt::AlignRight);

2、自定义图例的显示位置,需要先进行图例与图像的分离设置

 this->chart()->legend()->detachFromChart();

3、更换图例的图标显示

//MarkerShapeRectangle、MarkerShapeFromSeries、、MarkerShapeCircle
this->chart()->legend()->setMarkerShape(QLegend::MarkerShapeCircle)

六、自定义图例的图标样式

//修改图例内容的大小
    QFont font = this->chart()->legend()->font();
    font.setPointSizeF(22);
    this->chart()->legend()->setFont(font);

    // 图片大小应和上面定义的图标大小一致或小于(画布)
    QImage star(30, 30, QImage::Format_ARGB32);

    star.fill(Qt::transparent);
    // 加载图片
    QPixmap image = QPixmap(":/tmp/state.png");

    QPainter painter(&star);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(QRgb(0xf6a625));
    painter.setBrush(painter.pen().color());
    painter.drawPixmap(0,0,18,18,image);

    //标签字体颜色
    this->chart()->legend()->markers().at(0)->setLabelBrush(QBrush(QColor(Qt::red)));

    //图标背景填充
    this->chart()->legend()->markers().at(0)->setBrush(QBrush(star));

    //原有的图标边框设置为透明色
    this->chart()->legend()->markers().at(0)->setPen(QPen(Qt::transparent));

    //设置图例的位置与大小
    this->chart()->legend()->setGeometry(600,50,150,30);
    this->chart()->legend()->update();
    //如果想更好的优化图例,可以自定义一个图框用来实现图例的效果

效果:
QChart——折线,QT,qt
补(测试触摸屏的双指缩放):文章来源地址https://www.toymoban.com/news/detail-676338.html

//重写事件分发任务
bool M_ChartView::event(QEvent *pEvent)
{
    switch (pEvent->type())
    {
    //触屏
    case QEvent::TouchBegin:
        return touchBeginEvent(pEvent);  //自定义处理函数
    case QEvent::TouchUpdate:
        return touchUpdateEvent(pEvent);
    case QEvent::TouchEnd:
        return touchEndEvent(pEvent);
    }
    
    //这句不能丢,会出现奇怪的问题
    return QWidget::event(pEvent);
}
bool M_ChartView::touchBeginEvent(QEvent *event)
{
    QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
    QList<QTouchEvent::TouchPoint> touchStartPoints = touchEvent->touchPoints(); 
     
    touchEvent->accept();//表示要处理该事件,就不会再被添加到事件队列了
    return true;

}

bool M_ChartView::touchUpdateEventProcess(QEvent *event)
{
    QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
    QList<QTouchEvent::TouchPoint> touchUpdatePoints = touchEvent->touchPoints();
    //  多指触控
    if (2 == touchUpdatePoints.count())
    {
        QPoint firstPoint = touchUpdatePoints.at(0).screenPos().toPoint();  // 第一触点坐标
        QPoint lastPoint = touchUpdatePoints.at(1).lastScreenPos().toPoint();  //  第二触点坐标
        if(!m_tochu)
        {
            m_fristPoint = firstPoint;
            m_endPoint = lastPoint;
            m_Text->clear();
            m_tochu = true;
        }
        //Y轴
        QValueAxis *axisY=dynamic_cast<QValueAxis*>(this->chart()->axisY());
        const double yMin=axisY->min();
        const double yMax=axisY->max();
	//为了方便测试 参数都使用的固定值
        if(m_fristPoint.y() < m_endPoint.y())
        {
            if(m_endPoint.y() < lastPoint.y())
            {
                //放大
                if(yMax - yMin > 2)
                {
                    this->chart()->axisY()->setRange(yMin + 1,yMax - 1);
                    if(yMax - yMin < 15)
                    {
                        axisY->setTickCount(axisY->max()- axisY->min() +1);
                    }
                    else
                    {
                        axisY->setTickCount(11);
                    }
                }
                if(yMin == yMax)
                {
                    this->chart()->axisY()->setRange(yMin,yMax);
                    axisY->setTickCount(axisY->max() - axisY->min() +1);
                }

            }
            else {
                //缩小
                if(yMin >= 1)
                {
                    this->chart()->axisY()->setRange(yMin - 1,yMax + 1);
                    if(yMax - yMin < 15)
                    {
                        axisY->setTickCount(axisY->max()- axisY->min() +1);
                    }
                    else
                    {
                        axisY->setTickCount(11);
                    }
                }
            }
        }
        else
        {
            if(m_endPoint.y() > lastPoint.y())
            {
                //放大
                if(yMax - yMin > 2)
                {
                    this->chart()->axisY()->setRange(yMin + 1,yMax - 1);
                    if(yMax - yMin < 15)
                    {
                        axisY->setTickCount(axisY->max() - axisY->min() + 1);
                    }
                    else
                    {
                        axisY->setTickCount(11);
                    }
                }
                if(yMin == yMax)
                {

                    this->chart()->axisY()->setRange(yMin,yMax);
                    axisY->setTickCount(axisY->max() - axisY->min() + 2);
                }
            }
            else {
                //缩小
                if(yMin >= 1)
                {
                    this->chart()->axisY()->setRange(yMin - 1,yMax + 1);
                    if(yMax - yMin < 15)
                    {
                        axisY->setTickCount(axisY->max()- axisY->min() +1);
                    }
                    else
                    {
                        axisY->setTickCount(11);
                    }
                }
            }
        }

        //X轴
        QValueAxis *axisX=dynamic_cast<QValueAxis*>(this->chart()->axisX());
        const double xMin=axisX->min();
        const double xMax=axisX->max();

        if(m_fristPoint.x() < m_endPoint.x())
        {

            if(m_endPoint.x() < lastPoint.x())
            {
                if(xMax - xMin > 2)
                {
                    this->chart()->axisX()->setRange(xMin + 1,xMax - 1);
                    if(xMax - xMin < 20)
                    {
                        axisX->setTickCount(axisX->max()- axisX->min() +1);
                    }
                    else
                    {
                        axisX->setTickCount(11);
                    }

                }
                if(xMin == xMax)
                {
                    this->chart()->axisX()->setRange(xMin,xMax);
                    axisX->setTickCount(axisX->max() - axisX->min() +1);
                }
            }
            else
            {
                //缩小
                if(xMin >= 1)
                {
                    this->chart()->axisX()->setRange(xMin - 1,xMax + 1);
                    if(xMax - xMin < 20)
                    {
                        axisX->setTickCount(axisX->max()- axisX->min() +1);
                    }
                    else
                    {
                        axisX->setTickCount(11);
                    }
                }
            }
        }
        else
        {
  
            if(m_endPoint.x() > lastPoint.x())
            {
                //放大
                if(xMax - xMin > 2)
                {
                    this->chart()->axisX()->setRange(xMin + 1,xMax - 1);
                    if(xMax - xMin < 20)
                    {
                        axisX->setTickCount(axisX->max() - axisX->min() + 1);
                    }
                    else
                    {
                        axisX->setTickCount(11);
                    }
                }
                if(xMin == xMax)
                {
                    this->chart()->axisX()->setRange(xMin,xMax);
                    axisX->setTickCount(axisX->max() - axisX->min() + 1);
                }
            }
            else
            {
                //缩小
                if(xMin >= 1)
                {
                    this->chart()->axisX()->setRange(xMin - 1,xMax + 1);
                    if(xMax - xMin < 20)
                    {
                        axisX->setTickCount(axisX->max()- axisX->min() +1);
                    }
                    else
                    {
                        axisX->setTickCount(11);
                    }
                }
            }

        }


    }
    return true;
}

bool M_ChartView::touchEndEvent(QEvent *event)
{
    m_tochu = false;
    return true;
}

到了这里,关于QChart——折线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt(C++)使用QChart动态显示3个设备的温度变化曲线

    Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。 QChart支持多种类型的图表,包括折线图、散点图、柱状图、饼图等。它还支持多个数据系列(datase

    2024年02月08日
    浏览(48)
  • 09-1_Qt 5.9 C++开发指南_Qchart概述

    Qt Charts 可以很方便地绘制常见的折线图、柱状图、饼图等图表,不用自己耗费时间和精力开发绘图组件或使用第三方组件了。 本章首先介绍 Qt Charts 的基本特点和功能,以画折线图为例详细说明 Qt Charts 各主要部件的操作方法,再介绍各种常用图表的绘图方法,最后介绍鼠标

    2024年02月13日
    浏览(52)
  • 关于 Qt中的QString内容存在\u0000使用QChart(0x00)消除 的解决方法

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131860574 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)   做gps时,部

    2024年02月16日
    浏览(41)
  • 【Qt】Qt 开发环境安装 ( Qt 版本 5.14.2 | Qt 下载 | Qt 安装 )

    Qt 开发环境下载地址 : https://download.qt.io/archive/qt/ 该界面可以下载 Qt 各个版本的开发环境 ; Qt 版本选择 , Qt 的各个大版本都在同步更新 , 如 5.1 , 5.9 , 5.14 , 6.0 等 , 每个版本都有不同的性能和功能 , 每个版本进入后的二级目录的小版本 , 尽量选择最新的版本 ; 如进入 5.14 目录后

    2024年02月14日
    浏览(67)
  • 【 Qt 的“前世”与“今生”】Qt 的起源 | Qt 的发展历程 | 为什么选择 Qt | Qt 的授权模式 | Qt 版本选择 | Qt Widgets和QML | Qt 程序发布

    目录 1、什么是 Qt ? 2、Qt 可以用来做什么? 3、Qt 的由来与发展 3.1、Qt 的起源与发展 3.2、Qt 发展经历的三家公司 4、为什么选择 Qt ? 5、Qt 支持的平台 6、Qt 的授权模式 7、Qt 版本的选择 8、选择 QML 还是 Qt Widgets? 8.1、什么是 Widgets ? 8.2、什么是 QML ? 8.3、Widgets 与 QML 工程

    2024年02月05日
    浏览(61)
  • Qt不会操作?Qt原理不知道? | Qt详细讲解

    UI界面与控件类型介绍 Qt设计器原理 Qt设计器(UI界面)是用于设计和构建带有Qt Widgets 的图形用户界面(QT GUI)。注意:必须在建立项目时勾选上.ui文件这一项 控件类型的介绍 信号与槽机制处理 信号与槽是用与对象之间的通信,是Qt的核心 注意:信号与槽不是C++标准代码,

    2023年04月08日
    浏览(37)
  • 【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

    博客主页:Duck Bro 博客主页 系列专栏:Qt 专栏 关注博主,后期持续更新系列文章 如果有错误感谢请大家批评指出,及时修改 感谢大家点赞👍收藏⭐评论✍ 文章编号:Qt 学习笔记 / 02 1. 安装包下载(网盘链接) 链接:https://pan.baidu.com/s/1t3jbYcFYFuJIfe0hPmeDmQ?pwd=duck 提取码:du

    2024年04月26日
    浏览(99)
  • QT设置二级菜单 QT获取命令行参数 QT获取系统环境变量 QT QStatusBar showMessage的坑

    提示: 可以使用 qss 或者一些接口函数对 QMenu 和 QAction 进行美化 在操作过程中,最开始使用的QT的GUI程序,因为GUI程序默认的标准输出是QTCREATOR的应用程序输出窗口,所以在命令行窗口是看不到的,但是这也是可以配置的qt在GUI显示时,将调试信息输出到控制台的设置。以上

    2023年04月09日
    浏览(49)
  • 【QT学习二】Qt Design中使用Qt的基本布局

    目录 概述 Qt Design中使用Qt的基本布局 控件在哪? 怎么使用? 直接拖拽布局控件 使用工具栏 Layout的属性 在我们使用Qt做界面设计时,为了界面的整洁美观,往往需要对界面中的所有控件做一个有序的排列,以及设置各个控件之间的间距等等,为此Qt为界面设计提供了基本布

    2024年02月08日
    浏览(41)
  • <QT开发> QT开发工具-之-QT应用程序打包

    <QT开发> QT开发工具-之-QT应用程序打包 笔者为什么会写这篇文章呢?这是因为,笔者使用windows QT开发了一个测试工具。目的是通过TCP/IP测试其它应用程序。首先这个QT程序是笔者自己开发的,所以笔者的电脑当然是可以运行这个QT程序的,但是想要这个QT程序在其它同事的

    2024年02月12日
    浏览(152)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包