【嵌入式——QT】QT Charts

news2024/9/24 5:31:32

【嵌入式——QT】QT Charts

  • 概述
  • Qt提供的坐标轴类
  • QChart
  • QLineSeries
  • QValueAxis
  • 常见图表及用到的序列类
  • 图示
  • 代码示例

概述

QT Charts模块是一组易于使用的图表组件,它基于Qt的Graphics View架构,其核心组件是QChartView和QChart,QChartView父类是QGraphicsView,就是Graphics View架构的视图组件,所以QChartView是用于显示图表的视图,要想使用Qt Charts模块,就要在.pro文件中引入 Qt += charts

Qt提供的坐标轴类

  • QValueAxis:数值坐标轴;
  • QCategoryAxis:分组数值坐标轴;
  • QLongValueAxis:对数数值坐标轴;
  • QBarCategoryAxis:类别坐标轴;
  • QDateTimeAxis:日期时间坐标轴;

QChart

QChart是组合图表各部件,显示各种数据序列的绘图组件。

QChart主要函数

  • setTitle():设置图表标题;
  • setTitleFont():设置图表标题字体;
  • setTitleBrush():设置图表标题画刷;
  • setTheme():设置主题;
  • setMargins():设置绘图区与图表边界的4个边距;
  • legend():返回图表的图例;
  • setAnimationOptions():设置序列或坐标轴的动画效果;
  • addSeries():添加序列;
  • series():返回图表拥有的序列的列表;
  • removeSeries():移除一个序列,但并不删除序列对象;
  • removeAllSeries():移除并删除图表的所有序列;
  • addAxis():为图表的某个方向添加坐标轴;
  • axes():返回某个方向的坐标轴列表;
  • setAxisX():设置某个序列的水平方向的坐标轴;
  • setAxisY():设置某个序列的垂直方向的坐标轴;
  • removeAxis():移除一个坐标轴;
  • createDefaultAxes():根据已添加的序列的类型,创建缺省的坐标轴,前面已有的坐标轴会被删除;

QLineSeries

QLineSeries是用于绘制二维数据点的折线图。
QLineSeries类主要函数

  • setName():设置序列的名称 ;
  • chart():返回序列所属的图表对象 ;
  • setVisible():设置序列可见性;
  • show():显示序列;
  • hide():隐藏序列 ;
  • setColor():设置序列线条颜色 ;
  • setPen():设置绘制线条的画笔 ;
  • setBrush():设置绘制数据点的画刷 ;
  • setPointsVisible():设置数据点可见性 ;
  • append():添加一个数据点到序列;
  • insert():在某个位置插入一个数据点 ;
  • replace():替换某个数据点;
  • clear():清空所有数据点 ;
  • removePoints():从某个位置开始,删除指定个数的数据点;
  • setPointLabelsVisible():设置数据点标签的可见性;
  • setPointLabelsColor():设置数据点标签的文字颜色;
  • setPointLabelsFont():设置数据点标签的字体;
  • setPointLabelsFormat():设置数据点标签的格式;

QValueAxis

QValueAxis是数值坐标轴。

QValueAxis主要函数

  • setVisible():设置坐标轴可见性;
  • orientation():返回坐标轴方向;
  • setMin():设置坐标轴最小值;
  • setMax():设置坐标轴最大值;
  • setTitleVisible():设置轴标题可见性;
  • setRange():设置坐标轴最大、最小值范围 ;
  • setTitleText():设置轴标题文字;
  • setTitleFont():设置轴标题字体 ;
  • setLabelFromat():设置标签格式 ;
  • setLabelsBrush():设置标签的画刷;
  • setLabelsColor():设置标签的颜色 ;
  • setLabelsFont():设置标签的字体 ;
  • setTickCount():设置坐标轴主刻度的个数 ;
  • setLineVisible():设置轴线和刻度线的可见性;
  • setLinePen():设置轴线和刻度线的画笔;
  • setGridLineColor():设置网格线颜色 ;
  • setGridLinePen():设置网格线画笔;
  • setMinorTickCount():设置两个主刻度之间的次刻度的个数 ;
  • setMinorGridLineColor():设置次网格线的颜色 ;
  • setMinorGridLinePen():设置次网格线的画笔 ;
  • setMinorGridLineVisible():设置次网格线的可见性;

常见图表及用到的序列类

  • 柱状图:QBarSeries;
  • 水平柱状图:QHorizontalBarSeries;
  • 百分比柱状图:QPercentBarSeries;
  • 水平百分比柱状图:QHorizontalBarSeries;
  • 堆叠柱状图:QStackedBarSeries;
  • 水平堆叠柱状图:QHorizontalBarSeries;
  • 火柴盒图:QBoxPlotSeries;
  • 饼图:QPieSeries;
  • 折线图:QLineSeries;
  • 光滑折线图:QSplineSeries;
  • 散点图:QScatterSeries;
  • 面积图:QAreaSeries;
    这些类都是从QAbstractSeries类继承而来的。

图示

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/669535a0574b4c60ad9396172185185a.png
在这里插入图片描述
在这里插入图片描述

代码示例

QChartMainWindow.h

#ifndef QCHARTMAINWINDOW_H
#define QCHARTMAINWINDOW_H

#include <QMainWindow>
#include <QtCharts>

namespace Ui
{
    class QChartMainWindow;
}

class QChartMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit QChartMainWindow(QWidget* parent = nullptr);
    ~QChartMainWindow();

    QLineSeries* curSeries;//当前序列
    QValueAxis* curAxis;//当前坐标轴

    void createChart();//创建图表
    void prepareData();//更新数据
    void updateFromChart();//从图表更新到界面

    void initUi();



private slots:
    void on_comboBox_currentIndexChanged(int index);

    void on_comboBox_2_currentIndexChanged(int index);

    void on_pushButton_3_clicked();

    void on_checkBox_6_stateChanged(int arg1);

    void on_checkBox_7_stateChanged(int arg1);

    void on_horizontalSlider_valueChanged(int value);

    void on_radioButton_clicked();

    void on_radioButton_2_clicked();

    void on_radioButton_3_clicked();

    void on_radioButton_4_clicked();

    void on_checkBox_2_stateChanged(int arg1);

    void on_radioButton_9_clicked();

    void on_radioButton_10_clicked();

    void on_checkBox_3_stateChanged(int arg1);

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_8_clicked();

    void on_radioButtonX_clicked();

    void on_radioButtonY_clicked();

    void on_pushButtonRange_clicked();

    void on_pushButton_5_clicked();

private:
    Ui::QChartMainWindow* ui;

    QChart* chart;

    QLineSeries* series0;
    QLineSeries* series1;
};

#endif // QCHARTMAINWINDOW_H

QChartMainWindow.cpp

#include "QChartMainWindow.h"
#include "ui_QChartMainWindow.h"
#include <QTime>
#include <QFontDialog>
#include <QColorDialog>
QChartMainWindow::QChartMainWindow(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui::QChartMainWindow)
{
    ui->setupUi(this);
    createChart();
    prepareData();
    updateFromChart();
    initUi();
}

QChartMainWindow::~QChartMainWindow()
{
    delete ui;
}

void QChartMainWindow::createChart()
{
    chart = new QChart();
    chart->setTitle(u8"函数曲线");
    ui->graphicsView->setChart(chart);
    ui->graphicsView->setRenderHint(QPainter::Antialiasing);
    ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignTop);
    //创建折线序列
    series0 = new QLineSeries();
    series1 = new QLineSeries();
    series0->setName(u8"Sin曲线");
    series1->setName(u8"Cos曲线");
    curSeries = series0;
    QPen pen;
    pen.setStyle(Qt::DotLine);
    pen.setWidth(2);
    pen.setColor(Qt::red);
    series0->setPen(pen);
    pen.setStyle(Qt::SolidLine);
    pen.setColor(Qt::blue);
    series1->setPen(pen);
    chart->addSeries(series0);
    chart->addSeries(series1);
    //数值坐标轴 X轴
    QValueAxis* axisX = new QValueAxis;
    curAxis = axisX;
    axisX->setRange(0, 10);
    axisX->setLabelFormat("%.1f");
    axisX->setTickCount(11);
    axisX->setMinorTickCount(4);
    axisX->setTitleText("time(secs)");
    //数值坐标轴 Y轴
    QValueAxis* axisY = new QValueAxis;
    axisY->setRange(-2, 2);
    axisY->setLabelFormat("%.2f");
    axisY->setTickCount(5);
    axisY->setMinorTickCount(4);
    axisY->setTitleText("value");
    chart->setAxisX(axisX, series0);
    chart->setAxisX(axisX, series1);
    chart->setAxisY(axisY, series0);
    chart->setAxisY(axisY, series1);
}

//填充数据
void QChartMainWindow::prepareData()
{
    QLineSeries* series0 = (QLineSeries*)ui->graphicsView->chart()->series().at(0);
    QLineSeries* series1 = (QLineSeries*)ui->graphicsView->chart()->series().at(1);
    series0->clear();
    series1->clear();
    qsrand(QTime::currentTime().second());
    qreal t=0, y1, y2, intv=0.1;
    qreal rd;
    int cnt = 100;
    for(int i=0; i<cnt; i++) {
        rd=(qrand()%10)-5;
        y1 = qSin(t)+rd/50;
        series0->append(t, y1);
        y2=qCos(t)+rd/50;
        series1->append(t, y2);
        t+=intv;
    }
}

void QChartMainWindow::updateFromChart()
{
    QChart* aChart = ui->graphicsView->chart();
    ui->lineEditTitle->setText(aChart->title());
    QMargins mg = aChart->margins();
    ui->spinBox->setValue(mg.left());
    ui->spinBox_2->setValue(mg.right());
    ui->spinBox_3->setValue(mg.top());
    ui->spinBox_4->setValue(mg.bottom());
}

void QChartMainWindow::initUi()
{
    ui->comboBox->addItem("NoAnimation", 0);
    ui->comboBox->addItem("GridAxisAnimations", 1);
    ui->comboBox->addItem("SeriesAnimations", 2);
    ui->comboBox->addItem("AllAnimations", 3);
    ui->comboBox_2->addItem("ChartThemeLight", 0);
    ui->comboBox_2->addItem("ChartThemeBlueCerulean", 1);
    ui->comboBox_2->addItem("ChartThemeDark", 2);
    ui->comboBox_2->addItem("ChartThemeBrownSand", 3);
    ui->comboBox_2->addItem("ChartThemeBlueNcs", 4);
    ui->comboBox_2->addItem("ChartThemeHighContrast", 5);
    ui->comboBox_2->addItem("ChartThemeBlueIcy", 6);
    ui->comboBox_2->addItem("ChartThemeQt", 7);
    ui->checkBox_7->setCheckState(Qt::Checked);
    ui->checkBox_6->setCheckState(Qt::Checked);
    ui->checkBox_2->setCheckState(Qt::Checked);
    ui->checkBox_3->setCheckState(Qt::Checked);
    ui->radioButton->setChecked(true);
    ui->horizontalSlider->setRange(0, 100);
    ui->horizontalSlider->setValue(100);
}

void QChartMainWindow::on_comboBox_currentIndexChanged(int index)
{
    switch(index) {
        case 0:
            chart->setAnimationOptions(QChart::NoAnimation);
            break;
        case 1:
            chart->setAnimationOptions(QChart::GridAxisAnimations);
            break;
        case 2:
            chart->setAnimationOptions(QChart::SeriesAnimations);
            break;
        case 3:
            chart->setAnimationOptions(QChart::AllAnimations);
            break;
    }
}


void QChartMainWindow::on_comboBox_2_currentIndexChanged(int index)
{
    switch(index) {
        case 0:
            chart->setTheme(QChart::ChartThemeLight);
            break;
        case 1:
            chart->setTheme(QChart::ChartThemeBlueCerulean);
            break;
        case 2:
            chart->setTheme(QChart::ChartThemeDark);
            break;
        case 3:
            chart->setTheme(QChart::ChartThemeBrownSand);
            break;
        case 4:
            chart->setTheme(QChart::ChartThemeBlueNcs);
            break;
        case 5:
            chart->setTheme(QChart::ChartThemeHighContrast);
            break;
        case 6:
            chart->setTheme(QChart::ChartThemeBlueIcy);
            break;
        case 7:
            chart->setTheme(QChart::ChartThemeQt);
            break;
    }
}


void QChartMainWindow::on_pushButton_3_clicked()
{
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    if(ok) {
        ui->graphicsView->chart()->legend()->setFont(font);
    }
}


void QChartMainWindow::on_checkBox_6_stateChanged(int arg1)
{
    if(arg1 ==2) {
        curSeries->setVisible(true);
    } else {
        curSeries->setVisible(false);
    }
}


void QChartMainWindow::on_checkBox_7_stateChanged(int arg1)
{
    if(arg1 ==2) {
        curSeries->setPointsVisible(true);
    } else {
        curSeries->setPointsVisible(false);
    }
}


void QChartMainWindow::on_horizontalSlider_valueChanged(int value)
{
    curSeries->setOpacity(value);
}


void QChartMainWindow::on_radioButton_clicked()
{
    ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignTop);
}


void QChartMainWindow::on_radioButton_2_clicked()
{
    ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignBottom);
}


void QChartMainWindow::on_radioButton_3_clicked()
{
    ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignLeft);
}


void QChartMainWindow::on_radioButton_4_clicked()
{
    ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignRight);
}


void QChartMainWindow::on_checkBox_2_stateChanged(int arg1)
{
    if(arg1 == 2) {
        ui->graphicsView->chart()->legend()->setVisible(true);
    } else {
        ui->graphicsView->chart()->legend()->setVisible(false);
    }
}


void QChartMainWindow::on_radioButton_9_clicked()
{
    curSeries=series0;
}


void QChartMainWindow::on_radioButton_10_clicked()
{
    curSeries=series1;
}


void QChartMainWindow::on_checkBox_3_stateChanged(int arg1)
{
    if(arg1 == 2) {
        ui->graphicsView->chart()->legend()->backgroundVisibleChanged(true);
    } else {
        ui->graphicsView->chart()->legend()->backgroundVisibleChanged(false);
    }
}


void QChartMainWindow::on_pushButton_clicked()
{
    chart->setTitle(ui->lineEdit->text());
}


void QChartMainWindow::on_pushButton_2_clicked()
{
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    if(ok) {
        ui->graphicsView->chart()->setTitleFont(font);
    }
}


void QChartMainWindow::on_pushButton_6_clicked()
{
    ui->lineEdit_2->setText(curSeries->name());
}


void QChartMainWindow::on_pushButton_7_clicked()
{
    QColor color = QColorDialog::getColor(curSeries->color(), this, u8"选择颜色");
    if(color.isValid()) {
        curSeries->setColor(color);
    }
}


void QChartMainWindow::on_pushButton_8_clicked()
{
    //TODO 曲线pen
}


void QChartMainWindow::on_radioButtonX_clicked()
{
    curAxis = (QValueAxis*)ui->graphicsView->chart()->axisX();
    ui->doubleSpinBoxMin->setValue(curAxis->min());
    ui->doubleSpinBoxMax->setValue(curAxis->max());
    ui->lineEditTitle->setText(curAxis->titleText());
    ui->checkBox->setChecked(curAxis->isTitleVisible());
}


void QChartMainWindow::on_radioButtonY_clicked()
{
    curAxis = (QValueAxis*)ui->graphicsView->chart()->axisY();
    ui->doubleSpinBoxMin->setValue(curAxis->min());
    ui->doubleSpinBoxMax->setValue(curAxis->max());
    ui->lineEditTitle->setText(curAxis->titleText());
    ui->checkBox->setChecked(curAxis->isTitleVisible());
}


void QChartMainWindow::on_pushButtonRange_clicked()
{
    curAxis->setRange(ui->doubleSpinBoxMin->text().toDouble(), ui->doubleSpinBoxMax->text().toDouble());
}


void QChartMainWindow::on_pushButton_5_clicked()
{
    QColor color = QColorDialog::getColor(curSeries->color(), this, u8"选择颜色");
    if(color.isValid()) {
        ui->graphicsView->chart()->legend()->setLabelColor(color);
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【傻瓜文档】鼎利测试软件Pilot Pioneer-② 数据分析与处理功能

数据分析与处理功能 数据导入、解码 ① 导入数据 两种方式: 添加新数据导入历史数据不需要的数据可以移除 ② 数据解码 正式格式的数据可以重解码,例如Rcu、dcf等等,尽量选择正式数据。 两种方式: 选中数据,右键选择重解码双击信令重解码后的文件会生成为DitIB的文件…

第二节 动态面板使用实例操作

1、使用元件库 2、使用添加元件库 1.添加外部元件库 2.自做元件库 保存为*.rplib文件&#xff0c;就可以给其他项目使用了。 3、制作母板 1、新建模版 2、导入旧模版 此操作主要用于想使用原型中已经做好母版&#xff0c;有时直接粘贴又粘贴不成功&#xff0c;需要按下面方式…

MQTT和Modbus的物联网网关协议区别分析

MQTT和Modbus的物联网网关协议区别分析 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;与Modbus是两种广泛应用在物联网环境中的通信协议&#xff0c;它们各自具有独特的优势和适用场景&#xff0c;下面将从多个维度对这两种网关协议进行详细区别分析。 首…

ShardingSphere+JPA+Druid实现分表操作

要在SpringBoot项目中实现分表操作&#xff0c;本文使用的是ShardingSphereJPADruid实现。过程中出现问题记录一下。 准备MySQL数据库表 这里准备的是一张主表test_cost&#xff0c;两张从表test_cost_0和test_cost_1&#xff0c;结构需要相同&#xff0c;主表只是声明了表结构…

3.21 day2 QT

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 要求: 1.需要使用Ui界面文件进行界面设计 2.ui界面上的组件相关设置&#xff0c;通过代码实现 3需要添加适当的动图

【C++】—— 装饰器模式

目录 &#xff08;一&#xff09;什么是装饰器模式 &#xff08;二&#xff09;为什么要使用装饰器模式 &#xff08;三&#xff09;装饰器模式的实现步奏 &#xff08;四&#xff09;代码示例 &#xff08;五&#xff09;装饰器模式优缺点 &#xff08;一&#xff09;什么…

解决GNURadio自定义C++ OOT块-导入块时报错问题

文章目录 前言一、问题描述二、解决方法1、安装依赖2、配置环境变量3、重新编译及安装三、结果1、添加结果2、运行结果前言 本文记录在 GNURadio 自定义 C++ OOT 块后导入块时报错 AttributeError: module myModule has no attribute multDivSelect。 一、问题描述 参考官方教…

css使用变量

vue3单文件SFC新特性在css里可以使用变量&#xff0c;具体使用如下&#xff1a; <template><div class"home-view"><span>测试</span><p>测试2</p></div> </template><script setup lang"ts"> imp…

Web Service接口测试

Web service 接口测试 一. web Service概念 Web service使用与平台和编程语言无关的方式进行通讯的一项技术, web service 是一个接口, 他描述了一组可以在网络上通过标准的XML消息传递访问的操作,它基于xml语言协议来描述要执行的操作或者要与另外一个web 服务交换数据, 一组…

Leetcode 994. 腐烂的橘子

心路历程&#xff1a; 一开始以为和刚做过的岛屿问题很像&#xff0c;只不过是把岛屿问题换成BFS去做&#xff0c;然后再加上一些计数的规则。结果做完后发现只能通过一半左右的测试用例&#xff0c;发现有一个逻辑错误在于&#xff0c;当腐烂的橘子位于两端时&#xff0c;可以…

代码随想录算法训练营第day25|216.组合总和III、 17.电话号码的字母组合

216.组合总和III 力扣题目链接 (opens new window) 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输…

转置卷积(transposed-conv)

一、什么是转置卷积 1、转置卷积的背景 通常&#xff0c;对图像进行多次卷积运算后&#xff0c;特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等)&#xff0c;需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作&#xff0c…

el-table的border属性失效问题解决方案

目录 问题&#xff1a; 使用的代码&#xff1a; 官方文档的说明&#xff1a; 可能的问题所在&#xff1a; 关于使用了作用域插槽&#xff1a; a.自定义内容的样式覆盖&#xff1a; b.表格结构的改变&#xff1a; 解决方案&#xff1a; 通过css样式解决&#xff1a; 下面…

2024年【高压电工】考试总结及高压电工考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工考试总结是安全生产模拟考试一点通生成的&#xff0c;高压电工证模拟考试题库是根据高压电工最新版教材汇编出高压电工仿真模拟考试。2024年【高压电工】考试总结及高压电工考试技巧 1、【单选题】 ()指正常情…

自然语言处理实战项目28-RoBERTa模型在BERT的基础上的改进与架构说明,RoBERTa模型的搭建

大家好,我是微学AI,今天给大家介绍下自然语言处理实战项目28-RoBERTa模型在BERT的基础上的改进与架构说明,RoBERTa模型的搭建。在BERT的基础上,RoBERTa进行了深度优化和改进,使其在多项NLP任务中取得了卓越的成绩。接下来,我们将详细了解RoBERTa的原理、架构以及它在BERT…

解决Oracle VM VirtualBox无法与Windows互相复制粘贴的教程

说明&#xff1a;要实现从Windows上复制然后在VM VirtualBox上粘贴&#xff0c;必须要在VM VirtualBox上下载virtualbox-guest-dkms 第一步&#xff1a; 第二步&#xff1a; 按CtrlALTT打开命令终端输入 sudo apt-get install virtualbox-guest-dkms 然后重启 第三步&…

Docusaurus和HelpLook:谁更适合做知识库管理

在当今信息化时代&#xff0c;企业建立和维护一个好用、高效、能持续更新的知识库&#xff0c;对内部沟通、团队合作和客户服务都很重要。Docusaurus和HelpLook都是很好的知识库管理工具&#xff0c;但它们的功能和优势各有不同。跟着我一起深入了解两个工具之间的优劣&#xf…

权限管理系统-0.5.0

六、审批管理模块 审批管理模块包括审批类型和审批模板&#xff0c;审批类型如&#xff1a;出勤、人事、财务等&#xff0c;审批模板如&#xff1a;加班、请假等具体业务。 6.1 引入依赖 在项目中引入activiti7的相关依赖&#xff1a; <!--引入activiti的springboot启动器…

【STM32嵌入式系统设计与开发】——8usart(串口通讯实验)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;USART1初始化函数(usart1_init())&#xff08;3&#xff09;USART数据发送函数&#xff08; USART1_Send_Data&#xff08;&…

iOS报错-Command PhaseScriptExecution failed with a nonzero exit code

问题&#xff1a;iOS debug没问题&#xff0c;一打包就报错&#xff1a; Command PhaseScriptExecution failed with a nonzero exit code 解决方法如下&#xff1a; 在项目的Pods目录下&#xff0c;找到Targets Support Files->Pods-xxxx-frameworks.sh 如下&#xff1a…