Qt Chats(一)绘制折线图

news2024/12/27 0:53:49

1、一个简单的QChart绘图程序

Qt Charts基于Qt的Graphics View架构,其核心组件是QChartView 和 QChart

  • QChartView是显示图标的视图,基类为QGraphicsView
  • QChart的基类是QGraphicsltem

QChart类继承关系

 QPolarChart 用于绘制 极坐标图的图表类

1.项目中使用Qt Charts模块,在.pro中添加 : Qt     +=charts

在头文件或原文件添加:

#include<Qtcharts>

using namespace QtCharts; 也可用宏定义  Qt_CHARTS_USE_NAMESPACE

2.mainwindow.cpp

#include "mainwindow.h"
#include <QLineSeries>
#include <QChartView>
#include <QtCharts>
#include <QValueAxis>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //ui->setUI(this);
     createChart();
     resize(600,400);
     setWindowTitle("QChart简单绘图");
}

MainWindow::~MainWindow()
{
}

void MainWindow::createChart()
{
  //创建图表
    QChartView *chartview=new QChartView(this);
    QChart *chart=new QChart();
    chart->setTitle(QStringLiteral("简单函数曲线"));

    chartview->setChart(chart);//将chart添加到chartview中
    setCentralWidget(chartview);

    //创建折线序列
     QLineSeries *series0=new QLineSeries();
     QLineSeries *series1=new QLineSeries();

     series0->setName(QStringLiteral("Sin曲线"));
     series1->setName(QStringLiteral("Cos曲线"));

     chart->addSeries(series0);//将序列添加到图表
     chart->addSeries(series1);

     //序列添加数值
     qreal t =0,y1,y2,intv=0.1;
     int cnt=100;
     for(int i=0;i<cnt;i++)
     {
         y1=qSin(t);
         series0->append(t,y1);
         y2=qSin(t+20);
         series1->append(t,y2);
         t+=intv;
     }

     //创建坐标轴
     QValueAxis *axisX=new QValueAxis;
     axisX->setRange(0,10);
     axisX->setTitleText("time(secs)");

     QValueAxis *axisY=new QValueAxis;
     axisY->setRange(-2,2);
     axisY->setTitleText("value");

     chart->setAxisX(axisX,series0);//为序列添加坐标轴
     chart->setAxisY(axisY,series0);
     chart->setAxisX(axisX,series1);
     chart->setAxisY(axisY,series1);

}

效果:

3.图表的主要组成部分

QChart一般包括 序列、坐标轴、图例、图表标题等。

1.QChartView 的功能

QChartView是QChart的视图组件,类似于Graphics View架构中的QGraphics View。在窗口设计界面上使用QChartView时,就是先放置一个QGraphics View组件,然后提升为QChartView。

QChartView定义的类函数:

  • void setChart(QChart *chart),设置一个QChart对象作为显示的图表
  • QChart *chart()返回QChartView当前设置的QChart类对象
  • void setRubberBand(RubberBand& rubberBand),设置选择框的类型,即鼠标在视图组件上拖动选择的范围的方式。      

     QChartView::RubberBand枚举类型取值有: 

  1.  QChartView::NoRubberBand          无选择框 
  2. QChartView::VerticalRubberBand         垂直选择框
  3. QChartView::HorizontalRubberBand        水平选择框
  4. QChartView::RectangleRubberBand          矩形选择框
  • rubberBands rubberBand()  返回设置的选择框类型 

2.序列

 序列是数值的表现形式。案例中的两条曲线QLineSeries。图表的类型主要由序列的类型决定的,常见的图表类型如下:

Qt Charts常见图表及用到的序列类(图片来自Qt帮助文档)
柱状图QBarSeries水平柱状图 QHorizontalBarSeries
百分比柱状图 QPercentBarSeries水平百分比柱状图 QHorizontalPercentBarSeries
堆叠柱状图QStackedBarSeries水平堆叠柱状图QHorizontalStackedBarSeries
火柴盒图QBoxPlotSeries饼图QPieSeries
折线图 QLineSeries光滑曲线图QSplineSeries
散点图QScatterSeries面积图QAreaSeries

 序列的继承关系如图

 3.坐标轴 

坐标轴类封装了坐标轴的刻度、标签、网格线、标题等。

坐标轴类继承关系

4.图例

图例(Legend)是对图表上显示的序列的示例说明。如:

有线条颜色和文字说明。QLegend是封装了图例控制类功能的类,可以为每个序列设置图例中的文字,可以控制图例显示在图表的上下左右不同位置。图例是根据添加的序列自动生成的,但是也可以修改图例的一些属性。对于图例QLegendMarker,可以为每个序列的图例生成一个类似于QCheckBox的组件,在图例上单击序列的标记,可以控制序列是否显示。

2.稍复杂的QChart绘图程序

首先新建DialogPen用于设置一些对象pen属性

所以就可以自行绘制相应的pen控件

界面如图

DialogPen.h

#ifndef DIALOGPEN_H
#define DIALOGPEN_H

#include <QDialog>
#include <QDialog>
#include <QColorDialog>
#include <QPen>
#include <QPalette>

namespace Ui {
class DialogPen;
}

class DialogPen : public QDialog
{
    Q_OBJECT

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

    QPen getpen();  //获取对话框设置的Qpen的属性
    static QPen getPen(QPen initPen, bool &ok); //静态函数
    void setPen(const QPen &pen);//设置pen,用于对话框界面的显示

private slots:
    void on_pushButtoncolor_clicked();

private:
    Ui::DialogPen *ui;
    QPen m_pen;

};

#endif // DIALOGPEN_H

DialogPen.cpp

#include "dialogpen.h"
#include "ui_dialogpen.h"

DialogPen::DialogPen(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogPen)
{

     ui->setupUi(this);
     ui->comboBoxStyle->clear();
     ui->comboBoxStyle->addItem("NoPen",0);
     ui->comboBoxStyle->addItem("SolidLine",1);
     ui->comboBoxStyle->addItem("DashLine",2);
     ui->comboBoxStyle->addItem("DotLine",3);
     ui->comboBoxStyle->addItem("DashDotLine",4);
     ui->comboBoxStyle->addItem("DashDotDotLine",5);
     ui->comboBoxStyle->addItem("CustomDashLine",6);
     ui->comboBoxStyle->setCurrentIndex(0);

}

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

//获得设置的属性
QPen DialogPen::getpen()
{
   m_pen.setStyle(Qt::PenStyle(ui->comboBoxStyle->currentIndex())); //线型
   m_pen.setWidth(ui->spinBoxWidth->value());//线宽
   QColor  color=ui->pushButtoncolor->palette().color(QPalette::Button);
   m_pen.setColor(color); //颜色
   return  m_pen;
}


//静态函数,获取QPen
QPen DialogPen::getPen(QPen initPen, bool &ok)
{
    DialogPen * dlg = new DialogPen;//创建一个对话框
    dlg->setPen(initPen);  //设置初始化QPen
    QPen pen;
    int ret = dlg->exec(); //弹出对话框
    if (ret == QDialog::Accepted)
     {
            pen = dlg->getpen();//获取
            ok = true;
      }
     else
      {
            pen = initPen;
            ok = false;
      }
        delete dlg;   //删除对话框对象
        return pen;   //返回设置的QPen对象
}

//设置pen,并刷新显示界面
void DialogPen::setPen(const QPen &pen)
{
    m_pen=pen;
    ui->spinBoxWidth->setValue(pen.width());
    int i=static_cast<int>(pen.style());  //枚举类型转换为整形
    ui->comboBoxStyle->setCurrentIndex(i);
    QColor color=pen.color();
    ui->pushButtoncolor->setAutoFillBackground(true); //设置按钮的背景颜色
    QString str=QString::asprintf(("background-color:rgb(%d,%d,%d)"),color.red(),color.green(),color.blue());
    ui->pushButtoncolor->setStyleSheet(str);

}

void DialogPen::on_pushButtoncolor_clicked()
{
       QColor color = m_pen.color();
       QColorDialog::getColor(color);
       if(color.isValid())
       {
           QString str = QString::asprintf("background-color: rgb(%d,%d,%d)",color.red(),color.green(),color.blue());
           ui->pushButtoncolor->setStyleSheet(str);
       }
}

注:静态函数创建一个dlg实例,然后调用 dlg->setPen(initPen)进行初始化设置,运行对话框并获取返回状态,如果返回类型为 QDialog::Accepted,就调用  pen = dlg->getpen()获取设置属性后的QPen的对象,最后删除对话框并删除设置的QPen对象。

 

现在绘制主界面(设置主界面时,没有设置好布局,导致后面出来的图丑,懒得去改了)

 

maindow.h

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

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

相关文章

(自学)黑客技术——网络安全

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

基于微信小程序的婚庆婚纱摄影预约平台(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

彩色文本进度条

动态加色打印&#xff0c;\033控制&#xff0c;显示进行到的百分比&#xff0c;实时更新总共用时。 (本笔记适合能熟练应用字符串和循环技能的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程…

开发者必备!如何将闲置iPad Pro打造为编程工具,使用VS Code编写代码

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. ipad pro通过软件远程vscode6.1 创建TCP隧道 7. ip…

数据结构 | 队列

队列&#xff08;First In First Out&#xff09; 顺序队列 #include <iostream>class MyQueue {private:// store elementsvector<int> data; // a pointer to indicate the start positionint p_start; public:MyQueue() {p_start 0;}/** In…

爬虫怎么批量采集完成任务

目录 一、了解网络爬虫 二、Python与网络爬虫 三、批量采集任务的实现 1.确定采集网站及关键词 2.安装相关库 3.发送请求并获取响应 4.解析HTML文档 5.提取文章内容 6.保存文章内容 7.循环采集多篇文章 8.增加异常处理机制 9.优化代码性能 四、注意事项 总结 在当…

UNet网络模型学习总结

github&#xff1a;Machine_Learning/网络模型/UNet at main golitter/Machine_Learning (github.com) 因为VOC数据集太大&#xff0c;上传github很慢&#xff0c;所以就没有上传VOC数据&#xff0c;只有参考的目录位置。 数据集自行下载&#xff1a;https://host.robots.ox.…

顾曼宁(顾曼):漂流伞创始人与杭州高层次人才的杰出代表

杭州&#xff0c;这座以创新与活力为标签的城市&#xff0c;吸引了无数优秀的人才。在这座城市中&#xff0c;一位杰出的女性企业家以其独特的创业智慧和卓越的领导力&#xff0c;成为了杭州高层次人才的杰出代表之一&#xff0c;她的名字叫顾曼宁&#xff08;顾曼&#xff09;…

21天学会C++:Day14----模板

CSDN的uu们&#xff0c;大家好。这里是C入门的第十四讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 模板的使用 2.1 函数模板 2.2 类模板 3. 模板声明和定义…

7实体与值对象 #

本系列包含以下文章&#xff1a; DDD入门DDD概念大白话战略设计代码工程结构请求处理流程聚合根与资源库实体与值对象&#xff08;本文&#xff09;应用服务与领域服务领域事件CQRS 案例项目介绍 # 既然DDD是“领域”驱动&#xff0c;那么我们便不能抛开业务而只讲技术&…

Kotlin异常处理runCatching,getOrNull,onFailure,onSuccess(1)

Kotlin异常处理runCatching&#xff0c;getOrNull&#xff0c;onFailure&#xff0c;onSuccess&#xff08;1&#xff09; fun main(args: Array<String>) {var s1 runCatching {1 / 1}.getOrNull()println(s1) //s11&#xff0c;打印1println("-")var s2 ru…

基于springboot+vue的制造装备物联及生产管理ERP系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

序列化对象(ObjectOutputStream,ObjectInputStream)

1、对象序列化 作用&#xff1a;以 内存 为基准&#xff0c;把内存中的对象存储到磁盘文件中去&#xff0c;称为对象序列化使用到的流是对象字节输出流&#xff1a;ObjectOutputStream package com.csdn.d7_serializable; import java.io.*; public class ObjectOutputStreamDe…

Python爬虫程序设置代理常见错误代码及解决方法

Python爬虫程序设置代理是爬虫程序中常用的技巧&#xff0c;可以有效地绕过IP限制&#xff0c;提高爬虫程序的稳定性和效率。然而&#xff0c;在设置代理时&#xff0c;常会出现各种错误代码&#xff0c;这些错误代码可能会影响程序的正常运行&#xff0c;甚至导致程序崩溃。本…

Serverless 数仓技术与挑战(内含 PPT 下载)

近期&#xff0c;Databend Labs 联合创始人张雁飞发表了题为「Serverless 数仓技术与挑战」的主题分享。以下为本次分享的精彩内容&#xff1a; 主题&#xff1a; 「Serverless 数仓技术与挑战」 演讲嘉宾&#xff1a; 张雁飞 嘉宾介绍&#xff1a; Databend Labs 联合创始人…

Jenkins Job的Migrate之旅

场景 使用Jenkins 做为应用的定时任务处理&#xff0c; 在上面建立的800个左右的Job, 这个环境运行了很多年&#xff0c; 当初安装的最新版本是Jenkins 1.642.3&#xff0c; 现在因为OS需要升级等原因&#xff0c; 驻在上面的Jenkins 服务器也需要一并升级&#xff0c;在新的服…

【DevOps】Docker 容器及其常用命令

Docker 容器及其常用命令 1.容器2.Docker 常用命令2.1 Docker 环境信息2.2 容器生命周期管理2.2.1 docker run2.2.2 docker start / stop / restart 2.3 镜像仓库命令2.3.1 docker pull2.3.2 docker push 2.4 镜像管理2.4.1 docker images2.4.2 docker rmi / rm 2.5 容器运维操…

一键制作纯文字背景视频,让你轻松制作短视频!

你是否曾经被繁琐的视频制作流程所困扰&#xff1f;不用担心&#xff0c;现在有了纯文字视频制作神器&#xff0c;让你成为视频制作大师的梦想不再遥远&#xff01; 首先&#xff0c;让我们来看看纯文字视频制作神器主要的功能之一&#xff1a;一键生成短视频。只需输入你的文…

已解决: Microservice Error: Timeout Error: Service didn‘t respond in time

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…