Qt/C++ 波形绘制双缓冲下改善PaintEvent连续绘制卡顿问题(完整代码解析)

  1. 音频波形可视化:该控件用于将音频样本数据可视化为波形,常用于音频处理软件中以展示音频信号的时间域特性。

  2. 动态数据绘制:控件能够响应外部数据的变化并重新绘制波形,适用于实时或动态的音频数据流。

  3. 自定义绘制逻辑:通过Qt的绘图API,特别是QPainterQPainterPath,实现了波形的自定义绘制,包括线条的平滑、颜色渐变以及路径的描绘。

  4. 性能优化:通过双缓冲技术(使用QPixmap)和适当的数据处理,减少了绘制过程中的计算量,提高了渲染效率。

  5. 颜色编码:使用颜色渐变来区分波形的不同振幅区域,比如使用红色到蓝色的渐变表示波形的高低振幅,绿色表示零点线,使得波形的阅读更直观。

  6. 可扩展性:控件为Qt框架下的自定义控件,可以很容易地集成到更大的Qt应用程序中,并根据需求进行定制和扩展。

    
    #ifndef WAVEFORMWIDGET_H
    #define WAVEFORMWIDGET_H#include <QWidget>
    #include <QPixmap>class WaveformWidget : public QWidget {Q_OBJECTpublic:explicit WaveformWidget(QWidget *parent = nullptr);~WaveformWidget();void setSamples(const QList<float> &newSamples);protected:void paintEvent(QPaintEvent *event) override;void resizeEvent(QResizeEvent *event) override;private:QList<float> samples; // 用于存储音频样本的列表QPixmap buffer; // 双缓冲的画布void redrawBuffer(); // 在画布上重新绘制波形
    };#endif // WAVEFORMWIDGET_H
    #include "WaveformWidget.h"
    #include <QPainter>
    #include <QResizeEvent>WaveformWidget::WaveformWidget(QWidget *parent): QWidget(parent) {// 初始化双缓冲画布buffer = QPixmap(size());buffer.fill(Qt::black);
    }WaveformWidget::~WaveformWidget() {
    }void WaveformWidget::setSamples(const QList<float> &newSamples) {samples = newSamples;redrawBuffer(); // 更新画布
    }void WaveformWidget::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.drawPixmap(0, 0, buffer);
    }void WaveformWidget::resizeEvent(QResizeEvent *event) {// 调整画布大小并重新绘制buffer = QPixmap(event->size());buffer.fill(Qt::black);redrawBuffer();
    }void WaveformWidget::redrawBuffer() {// 确保画布准备好if (buffer.size() != size()) {buffer = QPixmap(size());}QPainter painter(&buffer);painter.setRenderHint(QPainter::Antialiasing);// 重置画布背景buffer.fill(Qt::black);if (samples.isEmpty()) return;const int middleY = buffer.height() / 2;const int upperLimit = middleY / 2;  // -50 to 50 对应的 Y 坐标const int lowerLimit = middleY + upperLimit;// 创建路径和描边路径QPainterPath path, strokePath;path.moveTo(0, middleY);qreal xStep = static_cast<qreal>(buffer.width()) / (samples.size() - 1);// 根据样本数据构造波形路径for (int i = 0; i < samples.size(); ++i) {qreal x = i * xStep;qreal y = middleY - (samples.at(i) * middleY / 100.0);path.lineTo(x, y);strokePath.lineTo(x, y);}// 绘制渐变QLinearGradient gradient(0, 0, 0, buffer.height());gradient.setColorAt(0.0, QColor(255, 0, 0));    // 顶部为红色gradient.setColorAt(0.25, QColor(0, 0, 255));   // 中部为蓝色gradient.setColorAt(0.5, Qt::transparent);      // 中间透明gradient.setColorAt(0.75, QColor(0, 0, 255));   // 中部为蓝色gradient.setColorAt(1.0, QColor(255, 0, 0));    // 底部为红色QPen pen(gradient, 2);painter.setPen(pen);painter.drawPath(strokePath);// 绘制中间的零点线QPen centerLinePen(Qt::green);centerLinePen.setWidth(1);painter.setPen(centerLinePen);painter.drawLine(0, middleY, buffer.width(), middleY);// 请求更新控件update();
    }

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

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

相关文章

Android Studio gradle 默认sourceSets配置

一. AS默认的sourceSets配置 sourceSets在Android插件中如何使用的&#xff1a;android {sourceSets {main {manifest.srcFile AndroidManifest.xmljava.srcDirs [src]resources.srcDirs [src]aidl.srcDirs [src]renderscript.srcDirs [src]res.srcDirs [res]assets.srcD…

Web开发基础概念

Python的Web开发是指使用Python语言来开发Web应用程序&#xff0c;如网站、网络应用程序等。在Python的Web开发中&#xff0c;有一些核心概念和技术栈需要了解。本文将介绍Python的Web开发框架和技术栈&#xff0c;并提供一些相关的资源供参考。一、Python的Web开发框架Python的…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

机器视觉系统-工业光源什么是同轴光

光路描述&#xff1a;反射光线与镜头平行&#xff0c;称为同轴光。 效果分析&#xff1a;光线经过平面反射后&#xff0c;与光轴平行地进入镜头。此时被测物相当于一面镜子&#xff0c;图像体现的是光源的信息&#xff0c;当“镜子“出现凹凸不平时&#xff0c;将格外地明显。 …

数据结构与算法-图论-DFS/BFS

图搜索算法在数据结构与算法领域中非常关键&#xff0c;用于在图形数据结构中搜索节点或路径。图是由节点&#xff08;也称为顶点&#xff09;以及连接这些节点的边组成的。在本文中&#xff0c;我们将详细探讨两种基础的图搜索算法&#xff1a;深度优先搜索&#xff08;DFS&am…

Linux异步io机制 io_uring

io_uring作为2019年的后起之秀&#xff0c;为linux异步网络编程新增一把倚天大剑&#xff0c;让我们简单学习一下&#xff01; 数据结构&#xff1a; a. sq (submition queue)&#xff1a;提交队列&#xff0c;一个存放待执行事件的环形队列 b. cq (completion queue): 完成…

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

【AI学习】Ben Thompson对 Nat Friedman 和 Daniel Gross的采访

读了Ben Thompson对 Nat Friedman 和 Daniel Gross的采访这篇文章&#xff0c;挺有趣。 先说最有趣的几个地方&#xff1a; 关于维苏威火山碳化古卷挑战&#xff1a;有趣而有意义&#xff01;有关日本的预测&#xff1a;有可能依靠芯片制造业&#xff0c;也许 2030 年代就又是…

visual studio2022,开发CMake项目添加rabbitmq库,连接到远程计算机并进行开发于调试

1.打开visual studio installer 。安装“用于 Windows 的 C CMake 工具” 2.新建CMake项目 3.点击VS的“工具”—>"选项“—>“跨平台”—>”连接管理器“,添加远程计算机。用来将VS编辑的代码传到服务器进行编译–连接—运行&#xff08;调试&#xff09;。 …

java中的泛型(三)——通配符

在前面的文章中我们简要介绍了泛型的概念以及泛型类和泛型方法的使用。在介绍泛型时我们说过在在java中一般用E、T、K、V、N、?这几个字母和符号来表示泛型&#xff0c;对于前面的几个字符它们的使用没有区别&#xff0c;只要注意它们所代表的类型就好。而对于最后一个&#x…

优化大型语言模型交互:提升查询和提示效果的26条原则

推荐下arxiv挂的一个提示词教程&#xff1a; https://github.com/VILA-Lab/ATLAS https://arxiv.org/abs/2312.16171 它提出了一套26条指导原则&#xff0c;改善和优化与大型语言模型&#xff08;LLMs&#xff09;的交互过程。通过这些原则&#xff0c;旨在简化对LLMs的查询和…

E4980A是德科技E4980A精密LCR表

181/2461/8938产品概述&#xff1a; Keysight E4980A 精密 LCR 表为各种元件测量提供了精度、速度和多功能性的最佳组合。E4980A 在低阻抗和高阻抗范围内提供快速测量速度和出色的性能&#xff0c;是元件和材料的一般研发和制造测试的终极工具。LAN、USB 和 GPIB PC 连接可提高…

概率论知识点(2)指数分布随机变量PDF,CDF及其特征函数

(1) X ∼ exp ⁡ ( 1 ) X\sim \exp(1) X∼exp(1), Y ∼ exp ⁡ ( 1 ) Y\sim \exp(1) Y∼exp(1), PDF: f X ( x ) = e − x , x > 0 f_{X}(x)=e^{-x},x>0 fX​(x)=e−x,x>0; f Y ( y ) = e − y , y > 0 f_{Y}(y)=e^{-y},y>0 fY​(y)=e−y,y>0CDF: F X…

【氮化镓】p-GaN HEMTs空穴陷阱低温冻结效应

这篇文章是关于低温条件下p-GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;栅极漏电的研究。文章通过电容深能级瞬态谱&#xff08;C-DLTS&#xff09;测试和理论模型分析&#xff0c;探讨了空穴陷阱对栅极漏电电流的影响。以下是对文章的总结&#xff1a; 摘要&#xf…

sql server 数据库的学习

前言&#xff1a; SQL Server是由微软公司开发的一种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;用于存储和检索数据。它提供了一个可扩展的、安全的和可靠的数据存储和管理解决方案&#xff0c;并主要用于构建企业级应用程序。SQL Server支持使用SQL&…

java中的异常处理机制

通俗易懂地说,java中的异常处理机制就是try-catch-finally, try是可能出现的异常,而catch是处理那些异常,可以有多个,catch中也可以用throw抛出异常,finally是无论如何都要进行执行的代码 catch中那个东西,只有一个异常处理了,才会执行下一个异常 接下来说说throw和throws吧 其…

本地认证的密码去哪了?怎么保证安全的?

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff1f;密文存在哪个文件下?该文件是否可以打开&#xff0c;并且查看到密文&#xff1f; 系统将输入的明文密码通过hash算法转为哈希值&#xff0c;且输入的值会在内存中立即删除无法查看。 然后将密文存放在C:…

基于Spring Boot的火车订票管理系统设计与实现

基于Spring Boot的火车订票管理系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页功能界面图&#xff0c;在系统首页可以查看…

ROS机器人小车建模仿真与SLAM(5)

目录 一、ROS中使用摄像头 1.1 验证摄像头设备可用 1.2 安装cheese 1.3 测试 二、获取摄像头驱动包 2.1 usb_cam 2.1.1 rosrun方式运行 2.1.2 roslaunch方式运行 三、摄像头标定(camera calibration) 3.2 标定前准备 3.2.1 标定板 3.2.2 摄像头调焦 3.3 标定摄像头…

MySQL__索引

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__索引&#xff09; ⏱️ 创作时间&#xff1a;2024年04月23日 ———————————————— 这里写目…