qwt实现码流柱状图多色柱体显示

news2024/10/10 8:41:07

qwt实现码流柱状图多色柱体显示

  • 1. 前言
  • 2. qt实现柱状图
  • 3.qwt基础说明
    • 3.1 qwt安装与使用
      • 3.1.1 下载qwt源码
      • 3.1.2 编译
      • 3.1.3 安装
      • 3.1.4 使用
    • 3.2 QwtPlotBarChart类
      • 3.2.1画图步骤
      • 3.2.2 specialSymbol
      • 3.3.3 barTitle
  • 4 BsBarChart定制
    • 4.1 每个柱体可以显示不同的颜色
    • 4.2 每个柱体可以显示对应的数值
    • 4.3 每个柱体的坐标显示不同的信息
    • 4.4 实现滚动拉动滚动条显示剩余的柱体
    • 4.5 单击/hover时,对应柱体显示想要的字符串
    • 4.6 单击选项,可以跳转到对应的柱体
  • 5 总结

1. 前言

在视频码流分析中,经常用到elecard 来查询码流的参考关系,其中就有柱状图来表示每一帧的示意图,如:
 图1

在工作之余,想通过Qt实现一款自己的码流分析工具,实现这个工具需要了解视频的一些概念,在此文章中不展开讲述,本文主要是讲述qt实现多色柱状图,以及一些定制化实现。简单的demo如下:
图2

功能:

1.每个柱体可以显示不同的颜色

2.每个柱体可以显示对应的数值

3.每个柱体的坐标显示不同的信息

4.实现滚动拉动滚动条显示剩余的柱体

5.单击/hover柱体,显示想要的字符串

6.单击选项,可以跳转到对应的柱体

2. qt实现柱状图

qt实现柱状图有多种方法,例如QChart, Qwt, QCustomPlot,甚至可以自己手搓,关于这三者的对比可以网上查询一些参考,个人觉得如果是实现一些简单的图表类,可以使用QChart,上手快,外观较其他两个漂亮,但在一些定制化中,却不够友好,而qwt就相对容易实现复杂的定制化,想要设计得很漂亮也可以,但需要比较深入研究,QCustomPlot源码就两个文件,可以方便集成到项目里,但由于不够成熟,对于一些复杂的画图,要自己实现很多功能。

为了实现图1的效果,本人一开始使用QtChart做,但最后发现,每个柱体要显示不同的颜色,会使用大量的内存,这个是不划算的,最后综合考虑下,使用qwt实现。

3.qwt基础说明

3.1 qwt安装与使用

这章内容在网络上有许多介绍,但有些作者在一些地方没有描述清楚,下面简略介绍下步骤:

本人的环境是:

pc: window 10

qt: qt5.9.8+mingw53_32

3.1.1 下载qwt源码

  1. sourceforge地址:
    release包:https://sourceforge.net/projects/qwt/files/qwt/
    git方式:https://sourceforge.net/p/qwt/git/ci/develop/tree/
  2. github地址:https://github.com/opencor/qwt
  3. wiki地址:https://qwt.sourceforge.io/

从上面的地址任意一个下载源码,如果后续需要研究源码,建议通过git下载仓库,方便回溯

3.1.2 编译

  • 最简单的是通过QtCreator打开qwt的工程,一键编译

  • 或者使用命令行方式,用qmake编译

编译模式选择:

选择release模式,这样编译出来的库size小一点,另外如果需要在qtdesigner,qtcreator上实现画图,需要用到release版本

当然debug,profile版本也是可以的,就是后续在发布软件时,size会大很多,发布软件一版都是release版本的库。

编译出来结果如下:
图3

3.1.3 安装

为了后续可以在qtcreator,qtdesiner上画图,就需要将编译出来的库,头文件,画图插件拷贝到qt的安装目录下:

将编译出来的designer\plugins\designer文件夹下的qwt_designer_plugin.dll放到C:\Qt\Qt5.9.8\5.9.8\mingw53_32\plugins\designer

另外,也需要:

  1. 将编译出来的lib文件夹下的libqwt.a,libqwtd.a放到C:\Qt\Qt5.9.8\5.9.8\mingw53_32\lib
  2. 将编译出来的lib文件夹下的qwt.dll,qwtd.dll放到C:\Qt\Qt5.9.8\5.9.8\mingw53_32\bin
  3. 将qwt源码目录下src里的*.h头文件全部拷贝到C:\Qt\Qt5.9.8\5.9.8\mingw53_32\include\Qwt,Qwt文件夹需要自行创建

3.1.4 使用

  1. 在工程中使用qwt,需要在*.pro文件里添加qwt的库和头文件链接,方法可以手动添加,也可以在pro文件里右键选择外部库路径
  2. 对于一份可移植的工程来说,一般做法是不链安装在qt目录下载qwt库的,应该在工程文件里创建一个文件夹,放置qwt的头文件和库,这样别人用的时候,就不需要额外去编译qwt。而且也可以放置多份不同的编译工具链编译出来的库,例如32位,64位的,这样就可以在不同平台中进行编译自己的code,而且发布软件时,也可以根据不同的平台进行发布
  3. 拖拽画图,如果qwt编译使用mingw53编译,那么只能在qtdesigner里打开进行画图,因为qtcreator是用mvsc编译的,qwt_designer_plugin.dll不匹配,方法是在打开的qtcreator工程里,在ui文件处右键,选择用qtdesigner打开。

3.2 QwtPlotBarChart类

qwt源码中有自带的example例子,可以参考来实现examples\distrowatch
图4

该例子已经可以实现每个柱体不同颜色,但跟所想要的效果还差很多功能,以下定制,是基于此开发的。

在此之前,需要先说明下,qwt的barChart的画图原理:
图5

  1. 高度:橙色蓝色两个柱体高度分别是1,2。

  2. 柱体位置:柱体的中间位置对应着坐标点

  3. 宽度:柱体的宽度默认是1,即两个柱体间应该紧密挨着,中间没有空隙,但可以通过QwtPlotBarChart的setLayoutHint,setSpacing来调节柱体的间的空隙。

    全部柱体的宽度平均分配整个画布宽度的大小,例如,画布大小是400宽度,一共4个柱体,那么每个柱体应该是100宽度。对应箭头1,宽度也是100。

    当通过setLayoutHint设置柱体的宽度,例如设置了20宽度,则箭头2是20宽度,箭头3空隙就是80,箭头4宽度是10,但箭头1还是100。

    setSpacing函数,设置箭头3的宽度

    箭头2+箭头3=箭头1

    箭头4=箭头2的一半

  4. 坐标:以柱体的左上角的坐标为例

    相对于整个画布的位置,分别是(-0.5,1),(0.5,2)

    相当于pc窗口来说,分别是(100,50),(101,51)

    画布坐标和pc窗口坐标的转换,通过mapToGlobal函数来转换

3.2.1画图步骤

如果没有任何定制化需求,QwtPlotBarChart在调用时,就两个步骤:

  • new一个QwtPlotBarChart实例

  • 调用setSamples传递数据

这样就能生成柱状图(当然plot, cavas还是要创建的),QwtPlotBarChart类内部会自动画出默认格式的

3.2.2 specialSymbol

而当需要定制不同的柱体(不包括图例,下标等定制),就需要实现重载函数:

virtual QwtColumnSymbol* specialSymbol(int sampleIndex, const QPointF& ) const;

qwt的QwtPlotBarChart类中的specialSymbol函数是一个空函数,如果需要实现定制化,可以继承QwtPlotBarChart,自行实现此函数,该函数里有参数smpleIndex,可见是可以对具体的某个特定柱体实现特定的定制的。

qwt源码中QwtPlotBarChart类的specialSymbol函数是一个空函数:

QwtColumnSymbol* QwtPlotBarChart::specialSymbol(
    int sampleIndex, const QPointF& sample ) const
{
   
    Q_UNUSED( sampleIndex );
    Q_UNUSED( sample );

    return NULL;
}

当在画柱体时,drawBar函数:

void QwtPlotBarChart::drawBar( QPainter* painter,
    int sampleIndex, const QPointF& sample,
    const QwtColumnRect& rect ) const
{
   
    const QwtColumnSymbol* specialSym =
        specialSymbol( sampleIndex, sample );

    const QwtColumnSymbol* sym = specialSym;
    if ( sym == NULL )
        sym = m_data->symbol;

    if ( sym )
    {
   
        sym->draw( painter, rect );
    }
    else
    {
   
        // we build a temporary default symbol
        QwtColumnSymbol columnSymbol( QwtColumnSymbol::Box );
        columnSymbol.setLineWi

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

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

相关文章

网络安全-IPv4和IPv6的区别

1. 2409:8c20:6:1135:0:ff:b027:210d。 这是一个IPv6地址。IPv6(互联网协议版本6)是用于标识网络中的设备的一种协议,它可以提供比IPv4更大的地址空间。这个地址由八组十六进制数字组成,每组之间用冒号分隔。IPv6地址通常用于替代…

大数据毕业设计选题推荐-B站热门视频数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Python 工具库每日推荐【Pillow】

文章目录 引言Python图像处理库的重要性今日推荐:Pillow工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:创建图像拼贴案例分析高级特性图像增强图像水印扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏,感兴…

数学建模算法与应用 第5章 插值与拟合方法

目录 5.1 插值方法 Matlab代码示例:线性插值 Matlab代码示例:样条插值 5.2 曲线拟合的线性最小二乘法 Matlab代码示例:线性拟合 5.3 最小二乘优化与多项式拟合 Matlab代码示例:多项式拟合 5.4 曲线拟合与函数逼近 Matlab代…

深入理解链表(SList)操作

目录: 一、 链表介绍1.1、 为什么引入链表1.2、 链表的概念及结构1.3、 链表的分类 二、 无头单向非[循环链表](https://so.csdn.net/so/search?q循环链表&spm1001.2101.3001.7020)的实现2.1、 [单链表](https://so.csdn.net/so/search?q单链表&spm1001.2…

系统架构师备考记忆不太清楚的点-信息系统-需求分析

霍尔三维结构 逻辑维:解决问题的逻辑过程 过程有明确问题、确立目标、系统综合、系统分析、优化、系统决策、实施计划 时间维:工作进度 这个纬度则是做工作计划的输出 有 规划阶段、拟定方案、研制阶段、生产阶段、安装阶段、运行阶段、更新阶段 知…

TiDB 优化器丨执行计划和 SQL 算子解读最佳实践

导读 在数据库系统中,查询优化器是数据库管理系统的核心组成部分,负责将用户的 SQL 查询转化为高效的执行计划,因而会直接影响用户体感的性能与稳定性。优化器的设计与实现过程充满挑战,有人比喻称这是数据库技术要持续攀登的珠穆…

Android SELinux——基础介绍(一)

Android 系统的安全策略是保护用户的隐私和数据不受侵害的重要保证,一个相对安全的计算环境对于确保移动设备的安全至关重要。随着新的威胁不断出现,Android 的安全策略也在不断发展和完善,以应对新的挑战。 一、概念介绍 1、SELinux SELin…

图像处理(一)——CMC特刊推荐

特刊征稿 01 期刊名称: Data and Image Processing in Intelligent Information Systems 截止时间: 提交截止日期:2024年11月15日 目标及范围: 感兴趣的主题包括但不限于: 先进的数据处理技术; 智能数据分析; 智能系统…

【论文阅读】DeepAC:实时六自由度目标跟踪的深度主动轮廓

Deep Active Contour for Real-time 6-DoF Object Tracking ICCV 2023 Project Page 【Question&Thinking】 解决的问题? RGB 视频的实时六自由度目标跟踪 现有的问题?提出的方法?达到的效果?存在的问题? Abst…

pnpm设置镜像源

# 查询当前使用的镜像源 pnpm get registry# 设置为淘宝镜像源 pnpm config set registry https://registry.npmmirror.com/# 还原为官方镜像源 pnpm config set registry https://registry.npmjs.org/参考链接 https://blog.csdn.net/weixin_45046532/article/details/139681…

谷歌地图服务地址汇总

写在前面&#xff1a; 1.参考自谷歌地图TMS地图服务地址收集&#xff0c;测试可用_谷歌地图url订阅订阅地址-CSDN博客&#xff0c;在这里备份一下&#xff0c;防止遗忘 2.需要翻墙 3.下面通过openlayers加载各风格地图 <!Doctype html> <html> <head><met…

MyBatis之ResultMap的association和collection

association例子演示 实体类演示 Data //书籍 public class Book {private String id;private String name;private String author;private Double price;private Integer del;private Date publishdate;private String info;//把出版社对象当作属性private Publisher pub;//-…

通过Express + Vue3从零构建一个用户认证与授权系统(二)数据库与后端项目搭建与实现

前言 上一篇完成了系统的相关设计文档的编写&#xff0c;本文将详细介绍如何一步步使用 TypeScript 和 Express 搭建一个模块化、类型安全的用户认证与授权系统&#xff0c;包括数据库设计、后端项目搭建、用户认证、角色与权限管理、错误处理以及 Swagger 文档集成。 项目准…

Solidity优质例子(二)物流的增删改查智能合约(附truffle测试)

本合约非常适合新手学习&#xff0c;其包含了基本的增删改查功能以及各个方式的不同之处的总结&#xff0c;本套合约我也编写了truffle测试&#xff0c;学习truffle测试的小伙伴也有福了~ 该合约的主要作用是通过区块链技术实现物流追踪系统的透明化、自动化与防篡改特性&#…

windows C++-移除界面工作线程(一)

本文档演示了如何使用并发运行时将 Microsoft 基础类 (MFC) 应用程序中由用户界面 (UI) 线程执行的工作移动到工作线程。 本文档还演示了如何提高冗长绘制操作的性能。 通过将阻塞性操作&#xff08;例如&#xff0c;绘制&#xff09;卸载到工作线程来从 UI 线程中移除工作&am…

Python爬虫使用示例-古诗词摘录

一、分析需求 目标地址&#xff1a; https://www.sou-yun.cn/Query.aspx?typepoem&id二、提取诗句 import os import re import requests import parsel#url https://www.sou-yun.cn/PoemIndex.aspx?dynastyTang&author14976&typeJie urlhttps://www.sou-yun.…

移动app的UI和接口自动化测试怎么进行?

标题&#xff1a;从0到1&#xff1a;移动App的UI和接口自动化测试 导语&#xff1a;移动App的快速发展使得UI和接口自动化测试成为了确保应用质量的重要环节。本文将从零开始介绍移动App的UI和接口自动化测试的基本概念以及如何进行测试。 第一部分&#xff1a;了解移动App自动…

【React】如何在MacBook的vscode中配置React环境

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Vscode 安装Node.js和npm 首先我们需要完成Node和npm的配置。 官网下载 下载安装包 首先最安全稳定的方法就是从官网下载。我们首先进入node.js的官网https://nodejs.org下载长期…

如何让你的Mac右键菜单栏更加的丰富多样

Mac电脑的右键菜单栏不如Windows的丰富&#xff0c;虽然可以在系统设置一些常用功能&#xff0c;但是种类不够丰富&#xff0c;这对于一些用惯了Windows的人来说可以说是非常的不习惯&#xff0c;不管是工作使用还是日常使用来说都有一些影响&#xff0c;如何才能让Mac的右键菜…