精华内容
下载资源
问答
  • QChart

    2020-05-12 09:01:08
    QChart ------------------------- 1.如果在调用addSeries后,继续向series内append数据,可能会出现图表显示不完全的问题。 2.调用addSeries,series不能为空,即series内没有数据,为空会报错。 -----------------...

    QChart

    -------------------------

    1.如果在调用addSeries后,继续向series内append数据,可能会出现图表显示不完全的问题。
    2.调用addSeries,series不能为空,即series内没有数据,为空会报错。
    3.调用setAxisX或setAxisY之前,要先调用addSeries,将series添加到chart上。不然会没有数据。且需要在调用addSeries之前将数据append完成,调用之后append无效。
    4.LineChart,X轴文字与值不对齐,需要调用setLabelsPosition()函数。

    axis->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue);
    

    5.调整边界范围可以让显示不全的文字显示全

    chart->layout()->setContentsMargins(0, 0, 0, 0);	 //设置外边界全部为0
    chart->setMargins(QMargins(0, 0, 0, 0));	//设置内边界全部为0
    chart->setBackgroundRoundness(0);	//设置背景区域无圆角
    

    6.当用QCategoryAxis作为x轴,QValueAxis作为y轴的时候如果y轴的值太小那么QCategoryAxis上的第一个坐标值不显示。

    axis->setLabelFormat("%f ---");	//设置格式,让数值变长,将左边区域撑大,有足够空间显示。
    

    -------------------------

    设置动画效果
    void setAnimationOptions(AnimationOptions options);
    QChart::NoAnimation		//	没有动画
    QChart::GridAxisAnimations	//	网格加载动画
    QChart::SeriesAnimations	//	图表加载动画
    QChart::AllAnimations		//	全部动画
    eg:
    	chart->setAnimationOptions( QChart::AllAnimations);
    
    设置标题
     void setTitle(const QString &title);
    
    设置图例是否显示
    void	setVisible(bool visible);
    eg:
    	chart->legend()->setVisible(true);
    
    设置图例显示位置
    void setAlignment(Qt::Alignment alignment);
     Qt::AlignLeft		//	左侧 
     Qt::AlignRight		//	右侧
     Qt::AlignBottom	//	底部
     Qt::AlignTop		//	顶部
    ....     		//	其他效果暂未测试
    eg:
    	chart->legend()->setAlignment( Qt::AlignLeft);
    
    添加一个系列
    void QChart::addSeries(QAbstractSeries *series);
    eg:	
    	QBarSeries * series = new QBarSeries();
    	chart->addSeries(series);
    
    将一个轴覆盖到X轴上
    //	类似函数还有: setAxisY,addAxis, createDefaultAxes
    void QChart::setAxisX(QAbstractAxis *axis, QAbstractSeries *series = Q_NULLPTR);
    eg:
    	QBarSeries * series = new QBarSeries();
    	QBarCategoryAxis *axisX = new QBarCategoryAxis();
    	chart->setAxisX(axisX,series);
    
    滚动图表可见区域
    chart->scroll(xrange, yrange);
    
    展开全文
  • QChart教程(一):QChart实现动态曲线

    万次阅读 多人点赞 2019-08-13 23:08:33
    QChart实现了各种各样的曲线,饼状图,柱状图等等,综合了之前的第三方图表模块QCustomPlot, QWT的功能,这两种也是很好的Qt图表类库。QChart在5.7之前只有商业版才有,5.7之后社区版也可以使用了。建议使用Qt5.7...

            QChart实现了各种各样的曲线,饼状图,柱状图等等,综合了之前的第三方图表模块QCustomPlot, QWT的功能,这两种也是很好的Qt图表类库。QChart在5.7之前只有商业版才有,5.7之后社区版也可以使用了。建议使用Qt5.7之后的版本,在安装的时候勾选QCharts模块,不然无法使用该功能

            QChart demo代码在Qt的安装路径:D:\Qt5.12.4\Examples\Qt-5.12.4\charts,用QtCreator可以直接打开,分析源码,即可引用到自己的工程。本教程利用官方提供的代码实现动态曲线,如下图所示:

             例如使用samples中提供的dynamicsspline, 引用它的代码,实现一个动态曲线。我的环境:Qt5.12.4  -  QtCreator,新建一个Qt工程,在.pro文件,增加charts模块:

    QT += charts

           例如,我的pro文件

                                          

            官方提供的代码都是直接用的布局,我们无法调节位置,如果用Qt designer,需要借助布局器来实现QChart的显示。例如用竖直布局器:

        

           当然显示QChart的方案很多,本demo采用布局器实现。

           曲线显示:

    QChartView *chartView = new QChartView(m_chart);
    ui->vLayout->addWidget(chartView);

           我的工程目录

                                               

           chart.h和chart.cpp是来自于官方例子的代码,但是我了些修改,定时器的触发, 数据的产生等都放到了主类里面。下面开始贴代码了。

          chart.h

    #ifndef CHART_H
    #define CHART_H
    
    #include <QtCharts/QChart>
    
    QT_CHARTS_BEGIN_NAMESPACE
    class QSplineSeries;
    class QValueAxis;
    QT_CHARTS_END_NAMESPACE
    
    QT_CHARTS_USE_NAMESPACE
    
    class Chart: public QChart
    {
        Q_OBJECT
    public:
        Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
        virtual ~Chart();
    
    public:
        QSplineSeries *m_series;
        QStringList m_titles;
        QValueAxis *m_axisX;
        QValueAxis *m_axisY;
        qreal m_x;
        qreal m_y;
    };
    
    
    #endif /* CHART_H */
    

          这里会用到QChart宏 QT_CHARTS_USE_NAMESPACE, 这里包含了一些列QChart的操作。

          在chart.h文件,主要是声明一些QChart的元素,曲线,坐标轴,数据列等。

          chart.cpp

    #include "chart.h"
    #include <QtCharts/QAbstractAxis>
    #include <QtCharts/QSplineSeries>
    #include <QtCharts/QValueAxis>
    
    Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
        QChart(QChart::ChartTypeCartesian, parent, wFlags),
        m_series(0),
        m_axisX(new QValueAxis()),
        m_axisY(new QValueAxis()),
        m_x(5),
        m_y(1)
    {
        m_series = new QSplineSeries(this);
        QPen green(Qt::red);
        green.setWidth(3);
        m_series->setPen(green);
        m_series->append(m_x, m_y);
    
        addSeries(m_series);
    
        //x, y坐标的位置,可以自行调整
        addAxis(m_axisX, Qt::AlignBottom);
        addAxis(m_axisY, Qt::AlignLeft);
    
        m_series->attachAxis(m_axisX);
        m_series->attachAxis(m_axisY);
        m_axisX->setTickCount(5);  //设置大刻度线的数目,默认是5,不能小于2
    
        //设置x, y坐标范围
        m_axisX->setRange(0, 10);
        m_axisY->setRange(-5, 10);
    }
    
    Chart::~Chart()
    {
    
    }
    

            这里,我稍微修改了代码,把定时器,数据产生移除了。放到了Mainwindow中。

            mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QTimer>
    #include "chart.h"
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    public slots:
        void on_btnStart_clicked();
        void generateData();
    
    private:
        Ui::MainWindow *ui;
    
        QTimer *m_timer;
        Chart *m_chart;
    };
    
    #endif // MAINWINDOW_H

           声明定时器,数据产生的槽函数,QChart的指针对象。

          mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QChartView>
    #include <QRandomGenerator>
    #include <QValueAxis>
    #include <QSplineSeries>
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        m_timer = new QTimer();
    
        m_chart = new Chart();
        m_chart->setTitle("Dynamic spline chart");
        m_chart->legend()->hide();
        m_chart->setAnimationOptions(QChart::AllAnimations);
        QChartView *chartView = new QChartView(m_chart);
        chartView->setRenderHint(QPainter::Antialiasing);
    
        ui->vLayout->addWidget(chartView);
    
        connect(m_timer, SIGNAL(timeout()), this, SLOT(generateData()));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_btnStart_clicked()
    {
        m_timer->start(500);
    }
    
    void MainWindow::generateData()
    {
        qreal x = m_chart->plotArea().width() / m_chart->m_axisX->tickCount();
        qreal y = (m_chart->m_axisX->max() - m_chart->m_axisX->min()) / m_chart->m_axisX->tickCount();
    
        m_chart->m_x += y;  //实时x坐标
        m_chart->m_y = QRandomGenerator::global()->bounded(5) - 2.5;  //实时y坐标
        m_chart->m_series->append(m_chart->m_x, m_chart->m_y);
    
        //实现整体平移,必须指明是QChart的方法,不然就是整个界面都平移
        m_chart->scroll(x, 0);
    }
    

            在构造函数中,初始化定时器,QChart, 连接信号槽。点击【开始采集】,触发定时器,采集间隔设为500ms,注意在QChart的坐标轴移动时,我写错了一点,导致整个界面都在移动,后来发现是 scroll方法没有指明调用方,应该是m_chart调用它,这样只有QChart的坐标轴会发生平移。代码不是很难,大家可以自己慢慢体会,有不懂得可以评论留言,有错误的地方也可以指出,我及时修正。

            在实际应用时,x,y的数据以实际数据为主,需要修改相关代码。

            编译运行后,就可以出现前面展示的画面。

            上面是在QtCreator中写的,在VS Qt中也可以实现,不过展示QChart的方法不同。

            其实,用QCustomPlot也可以很好的实现动态曲线,QWT也可以。

            注意:定时器很耗系统I/O, 再加上曲线绘制,表格刷新,数据库等, 最好另起一个线程,最近做了一个采集软件,采集3小时后,电脑崩溃,数据全丢了。各位慎重,如果是短时间的采集,放到主线程没问题,长时间,最好用子线程进行采集,展示。

     

            C++ 技术交流QQ群:894097803,提供技术支持,csdn资源免费下载,技术文档分享,行业大佬答疑解惑。 

    展开全文
  • QChart刷新

    千次阅读 2019-09-27 15:38:22
    QChart相关内容(刷新,图例,绘制双曲线,自定义坐标系): 刷新的核心: 添加新的数据前,使用: chart->removeAllSeries();//清除即可, 重要操作,QChart刷新的必要操作 QChart创建完整创建过程: ...

    QChart相关内容(刷新,图例,绘制双曲线,自定义坐标系):

    刷新的核心:

    添加新的数据前,使用:

     chart->removeAllSeries();//清除即可, 重要操作,QChart刷新的必要操作

     

    QChart创建完整创建过程:

     

                 

    第一部分数据预处理

    将相关数据压入list中,数据类型为QPoint类型

    第二部分添加数据

    保存需要绘制曲线的Y值:

    serial->append(list_2);//在serial中添加数据

    QlineSeries可以设置曲线的名称:

    serial->setName("Line 2");

    第三部分核心部分,可以把这个部分看成是图表所有相关内容,属性的设置部分

    QChart负责的部分,图例的设置,XY坐标,具体的数值,都需要添加到QCahrt对应的对象中

    chart->addSeries(serial);//将数据加载到QChart中

    第四部分简单理解成画布,将已经完成的图表进行展示

     注意:初始化的时候展示一次即可,后续的刷新部分,只需要对QCahrt中的相关内容进行设置即可

        QChartView *view=new QChartView(chart);//准备将chart进行显示
        //这个应该不用说的,消除锯齿
        view->setRenderHint(QPainter::Antialiasing);
        view->setFixedSize(600,600);

    程序如下:

    //Part1 在界面初始化的时候,就已经将QChart初始化了
    void Widget::UiForEC()
    {
        ......
        //此部分为QChart初始化
    
        //将一系列数据存入serial.
        //添加第一条线
        QList<QPointF>list;//将数据压入链表中
    
        QLineSeries *serial;//QChart的具体数据内容
        serial = new QLineSeries(this);//必须要new, 才能实现更新
    
        list<<QPointF(0,0)<<QPointF(Number_Size,0);//将数据压入链表中
    
        serial->setName("Line 1");//名称
    
        serial->append(list);//在serial中添加数据
    
        chart->addSeries(serial);//将数据加载到QChart中
    
    
        //添加第二条线
        //绘制 两条线的方式
    
        QList<QPointF>list_2;
        list_2<<QPointF(0,0)<<QPointF(Number_Size,Number_Size);
        serial = new QLineSeries(this);//需要赋予serial新的地址才有效,这也是在同一张绘制两条曲线的关键
        serial->append(list_2);//在serial中添加数据
        serial->setName("Line 2");
        chart->addSeries(serial);//将数据加载到QChart中
    
    
        //进行信号与槽的连接
        connectMarkers();
    
        chart->createDefaultAxes();//根据数据集,自动创建坐标轴,坐标轴的区间恰好完全容纳已有的数据集
    
        chart->setTitle("SAW");//chart名称
        chart->setAnimationOptions(QChart::SeriesAnimations);//以动画的形式显示
        chart->legend()->setVisible(true);//图例显示
        chart->legend()->setAlignment(Qt::AlignBottom);//(图例的位置)
    
    
        //最后需要将chart交给QChartView 
        QChartView *view=new QChartView(chart);//将chart进行显示
        
        view->setRenderHint(QPainter::Antialiasing);//消除锯齿
        view->setFixedSize(600,600);//chart大小
    
        ........
     
    }
    ..........
    //之后需要根据需求,对QChart进行重新绘制或者刷新
    void Widget::PutItOnScreen(QList<double> * PIOS,int size,QList<double> * ERROR1,QList<double> * ERROR2)
    {
        .......
    
        QList<QPointF> listForChartLINE1;
        QList<QPointF> listForChartLINE2;
    
        //添加数据
        for(int i = 0;i<Number_Size;i++)
        {
            listForChartLINE1.append(QPointF(i,ERROR1->at(i)));
            listForChartLINE2.append(QPointF(i,ERROR2->at(i)));
            qDebug()<<ERROR2->at(i);
        }
    
        QLineSeries *serial;
        //removeAllSeries是关键操作,只有这样,才能将之前的曲线完全剔除
        chart->removeAllSeries();//清除即可,重要操作,QChart刷新的必要操作
    
        //添加第一条线
        serial = new QLineSeries(this);//必须要new, 才能实现更新
        serial->append(listForChartLINE1);//在serial中添加数据
        serial->setName("Err");
    //    chart->createDefaultAxes();
        chart->addSeries(serial);//将数据加载到QChart中
    
        //规定坐标系,注意,每次添加一条曲线,都需要进行坐标系的确定
        QValueAxis *axisX = new QValueAxis();//轴变量、数据系列变量,都不能声明为局部临时变量
        QValueAxis *axisY = new QValueAxis();//创建X/Y轴
        axisX->setRange(0, Number_Size);
    //    axisY->setRange(MIN_D, MAX_D);//设置X/Y显示的区间Y_MINY_MAX
        axisY->setRange(Y_MIN, Y_MAX);//设置X/Y显示的区间
    
        chart->setAxisX(axisX);
        chart->setAxisY(axisY);//设置chart的坐标轴
        serial->attachAxis(axisY);
    
        //添加第二条线
        serial = new QLineSeries(this);
        serial->append(listForChartLINE2);//在serial中添加数据
        serial->setName("DeltaTheta");
    //    chart->createDefaultAxes();
        chart->addSeries(serial);//将数据加载到QChart中
    
        axisX = new QValueAxis();//轴变量、数据系列变量,都不能声明为局部临时变量
        axisY = new QValueAxis();//创建X/Y轴
        axisX->setRange(0, Number_Size);
    //    axisY->setRange(MIN_D, MAX_D);//设置X/Y显示的区间Y_MINY_MAX
        axisY->setRange(Y_MIN, Y_MAX);//设置X/Y显示的区间
    
        chart->setAxisX(axisX);
        chart->setAxisY(axisY);//设置chart的坐标轴
        serial->attachAxis(axisY);
    //    serial
        //连接数据集与坐标轴。特别注意:如果不连接,那么坐标轴和数据集的尺度就不相同,显示
    
    
        //需要再次添加信号和槽
        connectMarkers();
    
        qDebug()<<"完成绘制";
    
    }

    提示:new之后,请根据实际情况释放程序员在堆区申请的空间,比如每次new后将地址压入一个list中,最终或者在合适的地方一次性释放掉。

    展开全文
  • Qt QChart 动态实时图

    2021-05-26 22:16:56
    QT QCHART动态实时图
  • QChart问题

    2020-08-17 17:45:36
    QChart问题 使用QCart 的createDefaultAxes函数要先将series 加入到Qchartl里

    QChart问题
    使用QCart 的createDefaultAxes函数要先将series 加入到Qchartl里

    展开全文
  • QChart教程(三):QChart实现柱状图

    千次阅读 2019-08-15 23:12:42
    这次用QChart来做柱状图,效果如下: 依然是用VS2017_Qt5.12.4, 关于QChart的VS环境配置可以参考我的上一篇博客。 QChart教程(二):VS2017 Qt使用QChart 不过这次使用Graph...
  • QChart使用

    2020-08-17 14:57:02
    单把qchart部分拎出放出来,有用到的同学可以看看,可以棕头到尾的显示,也可以只显示最新的n个点。 先上效果图 不多BB,直接上代码???? 使用qchart需要在pro文件内加上charts QT += core gui charts MAINWINDOW_H...
  • Qt QChart,利用QChart绘制动态曲线

    千次阅读 2019-07-05 17:43:52
    Qt QChart,利用QChart绘制动态曲线 2017年07月11日 20:18:27wudroid阅读数 21511 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HiccupHiccup/article/details/74996618 这是一...
  • qchart 鼠标左键右键事件
  • QChart_series.zip

    2020-04-20 15:59:16
    运用QChart,在Qt平台实现实时动态曲线图绘制。运用到的主要知识:QChart,定时器。主要原理就是通过定时器计时,超过一定时间就执行一次画线操作,同时更新时间轴。原理很简单,但是对于初学者而言,还是值得借鉴...
  • QChart应用

    2017-09-04 18:05:08
    QChart应用 1.首先在项目文件 2.在用图表类时需要加入一个宏,否则相关图表类无法通过编译 3.在UI中加入一个QWidget容器空间提升为QCharView类型,QCharView专用于显示图表可以看Qt相关文档   4.编写代码(饼状图...
  • QChart的简单使用

    2021-01-08 17:11:15
    这篇博客的目的是记录一下今天学习QChart的内容以及使用初期踩到的几个坑。 使用QChart的前期准备 1. Qt5.9及以上版本; 2. .pro文件中添加QT += charts 3. 在使用QChart的各个控件之前,必须先声明一个命名空间。...
  • Qt QChart class

    2019-10-10 10:52:36
    The QChart class manages the graphical representation of the chart's series, legends, and axes QChart类管理图表的系列,图例和轴的图形表示 QChart is a QGraphicsWidget that you can show in a ...
  • QChart的用法

    2021-07-20 09:05:58
    qchart.h> #include “qpieseries.h” //#include “qchartview.h” #include #include //using namespace QtCharts; using namespace QtCharts; 这些都是必须的。 第三步:直接调用QChart才不会报错 ...
  • QChart动态曲线绘制.rar

    2019-11-19 13:38:23
    QT5.9工程,使用QChart类实现曲线动态绘制,采用的append方式,大家可以做下参考。有什么疑问,可以随时给我留言。
  • QChart柱状图刷新

    2018-01-28 12:20:00
    Qt5.8 使用自带的QChart实现改变柱状图X轴及柱状图效果,这个积分是系统自己定的,不值这么多,有需要的可以私信(资源名+邮箱)
  • QChart绘制静态图

    千次阅读 2019-09-26 10:12:31
    QChart 绘制静态图/简单图QChartQChart 继承关系QChart使用流程添加头文件创建QChartView简单绘图实例代码QLineSeries 和QscatterSeries 使用OpenGL加速 QChart 从QT5.7开始,社区版本也包含了Qt Charts。QtCharts...
  • Qt:QChart绘图介绍(主要包含类:QChart,QTableWidget,QGridLayout) 首先点击【打开】摁键,从excel中读入相关数据 之后点击【计算】摁键,将数据进行处理,并将部分输出到TableWidget中,部分绘制到QChart中 ...
  • Qt File读取txt文件数据并用QChart绘制曲线

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,927
精华内容 770
关键字:

qchart