6、QtCharts 悬浮曲线效果

news2024/11/27 2:49:10

文章目录

  • 效果
  • dialog.h
  • dialog.cpp
  • 悬浮槽函数

效果

在这里插入图片描述

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtCharts>
#include <QLineSeries>
#include <QGraphicsScene>
#include <QTimer>
#include <QSplineSeries>
#include <QPen>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    Ui::Dialog *ui;


private slots:
    /**
     * @brief 鼠标悬浮消息,进入序列1
     * @param point 悬浮时的坐标
     * @param state true:悬浮进入,false:悬浮退出
     * @return void
     */
     void slot_serieshovered1(const QPointF &point, bool state);
     void slot_serieshovered2(const QPointF &point, bool state);
private:
    /**
     * @brief 获取数据,内部模拟生产变化数据
     * @param[in]x X坐标
     * @return x对应的数据
     */
    qreal getData_1(qreal x);
    qreal getData_2(qreal x);
    /**
     * @brief 设置样式
     *
     */
    void changeStyle();

    /**
     * @brief 设置窗体调色板
     *
     */
    void setDialogPalette();

public:
    QChart* m_chart;//构建图表对象
    QSplineSeries* m_splineSerise1;
    QSplineSeries* m_splineSerise2;
    QGraphicsScene* m_pScene;
    QTimer* m_timer;//定时器
    QValueAxis* m_axisX;//X坐标轴
    QValueAxis* m_axisY;//Y坐标轴
    QPen m_penSeries1;  //系列1画笔
    QPen m_penSeries2;  //系列2画笔



};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QString>

const quint32 c_MaxSize=1000;//数据个数

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
    ,m_splineSerise1(NULL)
    ,m_splineSerise2(NULL)
{
    ui->setupUi(this);


    //setWindowFlags(Qt::FramelessWindowHint);

    //构建各个系列的画笔
    m_penSeries1 =QPen(Qt::green,2.f);
    m_penSeries2 =QPen(Qt::cyan,2.f);


    //构建曲线系列
    m_splineSerise1=new QSplineSeries(this);
    m_splineSerise2=new QSplineSeries(this);

    //为折线添加数据,曲线一
    qint32 i=0;
    qreal x=0.f;
    for (i=0;i<c_MaxSize;i++)
    {
        x=i*1.f/c_MaxSize;
        m_splineSerise1->append(i,getData_1(x));
    }

     //为折线添加数据,曲线二
    for ( i=0;i<c_MaxSize;i++)
    {
        x=i*1.f/c_MaxSize;
        m_splineSerise2->append(i,getData_2(x));
    }

    //构建图标对象
    m_chart=new QChart();

    //注意:先添加到图表再创建坐标轴,否则无效




    //构建坐标轴
    m_axisX = new QValueAxis();
    m_axisX->setRange(0,c_MaxSize);
    m_axisX->setTitleText(QString::fromLocal8Bit("Time"));//设置标题
    m_axisX->setLabelFormat("%g");//设置格式
    m_axisX->setTickCount(5);//设置刻度数

    m_axisY= new QValueAxis();
    m_axisY->setRange(-10,10);
    m_axisY->setTitleText(QString::fromLocal8Bit("T"));

    //将坐标轴绑定
    m_chart->setAxisX(m_axisX,m_splineSerise1);
    m_chart->setAxisY(m_axisY,m_splineSerise1);

    m_chart->setAxisX(m_axisX,m_splineSerise2);
    m_chart->setAxisY(m_axisY,m_splineSerise2);

     //隐藏图例
     m_chart->legend()->hide();



    //设置图标主题
    m_chart->setTheme(QtCharts::QChart::ChartThemeBlueCerulean);
    //设置标题
    m_chart->setTitle(QString("图表1"));
    //设置尺寸
    m_chart->setGeometry(0,0,500,300);


    //构建场景
    m_pScene =new QGraphicsScene(this);

    //为视图构建场景
    ui->graphicsView->setScene(m_pScene);

    //将图表添加到场景
    m_pScene->addItem(m_chart);

    //设置抗锯齿
    ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);

    //设置样式
    changeStyle();

    //1.将折线系列添加到图表
    m_chart->addSeries(m_splineSerise1);
    m_chart->addSeries(m_splineSerise2);

    //绑定鼠标悬浮的信号
    connect(m_splineSerise1,&QSplineSeries::hovered,this,&Dialog::slot_serieshovered1);
    connect(m_splineSerise2,&QSplineSeries::hovered,this,&Dialog::slot_serieshovered2);


}

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

void Dialog::slot_serieshovered1(const QPointF &point, bool state)
{
    QPen penHighlight(Qt::white,5.f);
    if(state)//悬浮进入
    {
        m_splineSerise1->setPen(penHighlight);
    }
    else
    {
        m_splineSerise1->setPen(m_penSeries1);
    }
}

void Dialog::slot_serieshovered2(const QPointF &point, bool state)
{
    QPen penHighlight(Qt::white,5.f);
    if(state)//悬浮进入
    {
        m_splineSerise2->setPen(penHighlight);
    }
    else
    {
        m_splineSerise2->setPen(m_penSeries2);
    }
}

qreal Dialog::getData_1(qreal x)
{
    return qSin(x*2*M_PI)*7;//正弦
}

qreal Dialog::getData_2(qreal x)
{
    return qCos(x*2*M_PI)*7;//余弦
}

void Dialog::changeStyle()
{

    /**
     * 修改窗体
     *
     */
    //根据图表的主题设置调色板
    setDialogPalette();

    /**
     * 修改图表
     *
     */
    m_chart->setBackgroundVisible(true);
    //m_chart->setBackgroundBrush(Qt::transparent);//设置为透明
    m_chart->setBackgroundBrush(Qt::lightGray);

     QPen penBackground;
     penBackground.setStyle(Qt::DotLine);
     penBackground.setColor(Qt::green);
     m_chart->setBackgroundPen(penBackground);
    /**
     * 修改绘图区
     *
     */
    m_chart->setPlotAreaBackgroundVisible(true);
    m_chart->setPlotAreaBackgroundBrush(Qt::gray);



    /**
     * 修改标题
     *
     */

    QFont fontTitle;
    fontTitle.setFamily(QString::fromLocal8Bit("华文琥珀"));
    fontTitle.setPointSizeF(20.f);
    m_chart->setTitleFont(fontTitle);
    //设置字色
    m_chart->setTitleBrush(Qt::black);


    /**
     * 修改刻度
     *
     */

    //设置刻度
    QFont fontAxis;
    fontAxis.setFamily(QString::fromLocal8Bit("微软雅黑"));
    fontAxis.setPointSizeF(12.f);
    m_axisX->setTitleFont(fontAxis);
    m_axisY->setTitleFont(fontAxis);
    //设置字色
    m_axisX->setTitleBrush(Qt::darkMagenta);
    m_axisY->setTitleBrush(Qt::darkMagenta);

    //设否显示刻度线
    m_axisX->setGridLineVisible(true);
    m_axisY->setGridLineVisible(true);
    //设置字体坐标轴

    QFont fontLabel;
    fontLabel.setFamily(QStringLiteral("微软雅黑"));
    fontLabel.setPixelSize(12);
    m_axisX->setLabelsFont(fontLabel);
    m_axisY->setLabelsFont(fontLabel);

    /**
     * 修改图例
     *
     */
    //对齐方式
    m_chart->legend()->setAlignment(Qt::AlignLeft);

    /**
     * 系列
     *
     */


    m_splineSerise1->setPen(m_penSeries1);

    QPen pn2(Qt::cyan,2.f);
    m_splineSerise2->setPen(m_penSeries2);

    /**
     * 开启动画
     *
     */

    QChart::AnimationOptions aniOptions=QChart::AllAnimations;
    //m_chart->setAnimationOptions(aniOptions);

}

void Dialog::setDialogPalette()
{
    QChart::ChartTheme theme=QChart::ChartThemeBlueIcy;
    m_chart->setTheme(theme);
    //根据选定的主题确定Dialog的调色板
    QPalette pal=window()->palette();
    switch (theme)
    {
       case QtCharts::QChart::ChartThemeLight:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    case QtCharts::QChart::ChartThemeBlueCerulean:
        pal.setColor(QPalette::Window,QRgb(0x121218));
        pal.setColor(QPalette::WindowText,QRgb(0x6d6d6));
        break;
    case QtCharts::QChart::ChartThemeDark:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    case QtCharts::QChart::ChartThemeBrownSand:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    case QtCharts::QChart::ChartThemeBlueNcs:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    case QtCharts::QChart::ChartThemeHighContrast:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    case QtCharts::QChart::ChartThemeBlueIcy:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    case QtCharts::QChart::ChartThemeQt:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    default:
        pal.setColor(QPalette::Window,QRgb(0xf0f0f0));
        pal.setColor(QPalette::WindowText,QRgb(0x404040));
        break;
    }
    window()->setPalette(pal);
}

悬浮槽函数

void Dialog::slot_serieshovered1(const QPointF &point, bool state)
{
    QPen penHighlight(Qt::white,5.f);
    if(state)//悬浮进入
    {
        m_splineSerise1->setPen(penHighlight);
    }
    else
    {
        m_splineSerise1->setPen(m_penSeries1);
    }
}

void Dialog::slot_serieshovered2(const QPointF &point, bool state)
{
    QPen penHighlight(Qt::white,5.f);
    if(state)//悬浮进入
    {
        m_splineSerise2->setPen(penHighlight);
    }
    else
    {
        m_splineSerise2->setPen(m_penSeries2);
    }
}

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

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

相关文章

为什么在DTO中请要使用包装类型

Java是一种强类型的面向对象编程语言&#xff0c;它为我们提供了一种特殊的类别&#xff0c;叫做数据传输对象&#xff08;Data Transfer Object&#xff0c;DTO&#xff09;。在本篇文章中&#xff0c;我们将详细讨论为什么在DTO中使用包装类型而非基础类型。 1. 什么是DTO&a…

电池原理与分类

1 电池基础知识 电池目前大量应用于我们的生活中&#xff0c;主要包括3C消费类、动力类、储能类。 图1 电池应用方向 备注&#xff1a;3C指的是计算机(Computer )、通讯&#xff08;Communication&#xff09;消费类电子产品&#xff08;Consumer Electronic&#xff09;三类…

GPT4做网页,完成度竟然这么高!!!

CHATGPT简介 chatgpt的自我介绍是这样的&#xff1a; 最近一段时间内&#xff0c;chatgpt可谓是数次引发热议&#xff0c;现在&#xff0c;让我们一起来看看&#xff0c;他所制作的网页究竟能到什么地步呢&#xff1f; 提示词 我给了CHATGPT如下的提示词&#xff0c;那么它…

【一周安全资讯1104】证监会发布《上市公司公告电子化规范》等9项金融行业标准;北京网信办对三家违反数据安全法规企业作出行政处罚

要闻速览 1、证监会发布《上市公司公告电子化规范》等9项金融行业标准 2、《网络安全标准实践指南—粤港澳大湾区跨境个人信息保护要求》公开征求意见 3、北京市网信办对三家企业未履行数据安全保护义务作出行政处罚 4、加拿大禁止政府雇员使用微信和卡巴斯基 5、次覆盖“人的…

CSS解决div行变块 ➕ CSS解决“table中的td文字溢出控制显示字数,显示省略号”的问题

CSS解决div行变块 ➕ CSS解决“table中的td文字溢出控制显示字数&#xff0c;显示省略号”的问题 1. div变块级设置1.1 先看不设置的效果1.2 再看设置之后的效果 2. 解决 table 中 td 内容过长问题2.1 CSS实现&#xff08;文字溢出控制td显示字数&#xff0c;显示省略号&#x…

ssm在线互助答疑系统-计算机毕设 附源码 20862

ssm在线互助答疑系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#…

(免费领源码)java#ssm#mysql 宠物领养系统08465-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1课题背景及意义 1.2研究现状 1.3ssm框架介绍 1.3论文结构与章节安排 2 宠物领养系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 …

LeetCode 421. 数组中两个数的最大异或值

原题链接&#xff1a;https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/description/?envTypedaily-question&envId2023-11-04 题目分析 异或且时间复杂度在nlogn内第一反应想到字典树&#xff0c;扫一遍存进字典树&#xff0c;然后遍历每个数&…

CAM模型可视化(可解释)

模型的可解释性问题一直是个关注的热点。注意&#xff0c;本文所说的“解释”&#xff0c;与我们日常说的“解释”内涵不一样&#xff1a;例如我们给孩子一张猫的图片&#xff0c;让他解释为什么这是一只猫&#xff0c;孩子会说因为它有尖耳朵、胡须等。而我们让CNN模型解释为什…

yolov5简易使用

1.环境配置 从github上下载好yolov5源码后&#xff0c;根据requirement文件配置环境&#xff0c;使用conda新建一个仿真环境&#xff0c;接着使用 pip install -r requirements.txt 来安装环境&#xff0c;安装后首先运行detect.py 发现安装后的环境不能使用&#xff0c;报…

windows10系统-17-文献管理软件

参考诸多文献管理软件的优劣比较如何&#xff1f;你有哪些使用心得&#xff1f; 参考我愿称之为目前最好用的文献管理和阅读软件&#xff01;readpaper 1 文献总结 文献总结是非常重要的一项技能&#xff0c;不知道大家看完文献后有没有总结文献的习惯&#xff0c;有的话那挺…

【中国知名企业高管团队】系列57:康佳KONKA

今天开始&#xff0c;华研荟为大家介绍中国电视行业的知名企业&#xff0c;接下来三天介绍位于深圳的电视三巨头&#xff0c;这三巨头以电视机研发、生产和销售起步&#xff0c;2000左右生产过非智能手机&#xff0c;但是在互联网时代被小米们抢走了电视和手机的很大一部分市场…

大数据之LibrA数据库系统告警处理(ALM-12016 CPU使用率超过阈值)

告警解释 系统每30秒周期性检测CPU使用率&#xff0c;并把实际CPU使用率和阈值相比较。CPU使用率默认提供一个阈值范围。当检测到CPU使用率连续多次&#xff08;可配置&#xff0c;默认值为10&#xff09;超出阈值范围时产生该告警。 平滑次数为1&#xff0c;CPU使用率小于或…

The world,The Matrix and Big Model

黑客帝国&#xff0c;打开了The Matrix与现实世界的关系。今天&#xff0c;现实版的“The Matrix”已经开始逐渐浮现。ChatGPT&#xff0c;打开了这个入口。"The Matrix" 变成了“Big Model”。话不多说&#xff0c;上图。人类借助“Big Model”离开“洞穴”。 人与T…

2023年【危险化学品经营单位安全管理人员】复审考试及危险化学品经营单位安全管理人员模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员复审考试考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员模拟考试题库题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位…

ASO优化之iOS应用关键词的优化技巧2

关键词优化始终必须包括由App Store算法索引的所有元数据元素&#xff0c;所以我们要在关键词字段方面与其他元数据相结合。另外&#xff0c;确保转化率优化策略&#xff0c;是适合我们的关键词策略的。 1、每个关键词只能使用一次。 Apple的算法无论我们使用的频率如何&#…

加密的手机号,如何模糊查询?

前几天&#xff0c;知识星球中有位小伙伴&#xff0c;问了我一个问题&#xff1a;加密的手机号如何模糊查询&#xff1f; 我们都知道&#xff0c;在做系统设计时&#xff0c;考虑到系统的安全性&#xff0c;需要对用户的一些个人隐私信息&#xff0c;比如&#xff1a;登录密码…

基于 NGram 分词,优化 Es 搜索逻辑,并深入理解了 matchPhraseQuery 与 termQuery

基于 NGram 分词&#xff0c;优化 Es 搜索逻辑&#xff0c;并深入理解了 matchPhraseQuery 与 termQuery 前言问题描述排查索引库分词&#xff08;发现问题&#xff09;如何去解决这个问题&#xff1f;IK 分词器NGram 分词器使用替换 NGram 分词器后进行测试matchPhraseQuery 查…

vivado布局分析

1、高亮显示布局 1. 在“ Netlist ” &#xff08; 网表 &#xff09; 窗口中 &#xff0c; 选择要分析的层级。 2. 从弹出菜单中 &#xff0c; 选择“ Highlight Leaf Cells ” → “ Select a color ” &#xff08; 高亮叶节点单元 > 选择颜色 &#xff09; 。 3. …

【C语法学习】9 - fputs()函数

文章目录 1 函数原型2 参数3 返回值4 输出机制5 比较6 示例6.1 示例16.2 示例2 1 函数原型 fputs()&#xff1a;将str指向的内存空间中存储的字符串发送至指定流stream&#xff0c;函数原型如下&#xff1a; int fputs(const char *str, FILE *stream)2 参数 fputs()函数有两…