QWT 之 QwtPlotDirectPainter直接绘制
QwtPlotDirectPainter 是 Qwt 库中用于直接在 QwtPlot 的画布上绘制图形的一个类。它提供了一种高效的方法来实时更新图表,特别适合需要频繁更新的数据可视化应用,例如实时数据流的显示。
使用 QwtPlotDirectPainter 的主要优势在于它可以绕过 QwtPlot 的缓冲机制,直接在画布上绘制,从而提高了绘制速度和效率。这对于需要快速响应变化的应用场景(如动态曲线、动画效果等)非常有用。
使用 QwtPlotDirectPainter 追加数据
下面是一个示例代码,展示了如何使用 QwtPlotDirectPainter 来逐步追加数据到 QwtPlotCurve 上,并且实时更新图表:
示例代码:
#include <QApplication>
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotDirectPainter>
#include <QVector>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QTimer>class RealTimePlot : public QWidget {Q_OBJECTpublic:RealTimePlot(QWidget *parent = nullptr) : QWidget(parent), m_x(0.0) {setupPlot();setupUI();}private slots:void appendData() {// 创建新的数据点double y = qSin(m_x); // 示例:正弦波数据m_samples.append(QPointF(m_x, y));// 更新 x 值,准备下一个数据点m_x += 0.1;// 使用 QwtPlotDirectPainter 实时绘制新数据点if (m_samples.size() > 1) {QwtPlotDirectPainter painter;painter.drawSeries(&m_curve, m_samples.size() - 2, m_samples.size() - 1);}// 如果需要调整轴范围,可以在这里调用 plot->setAxisScale() 和 plot->replot()}private:void setupPlot() {// 创建并配置 QwtPlotm_plot = new QwtPlot(this);m_plot->setTitle("Real-Time Plot with QwtPlotDirectPainter");// 创建曲线并设置其属性m_curve.attach(m_plot);m_curve.setPen(Qt::blue, 2);// 设置初始轴范围m_plot->setAxisScale(QwtPlot::xBottom, 0, 10);m_plot->setAxisScale(QwtPlot::yLeft, -1, 1);// 显示图表QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(m_plot);setLayout(layout);}void setupUI() {// 设置定时器以定期追加数据QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &RealTimePlot::appendData);timer->start(50); // 每 50 毫秒追加一个数据点}QwtPlot *m_plot;QwtPlotCurve m_curve;QVector<QPointF> m_samples;double m_x;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);RealTimePlot plotWidget;plotWidget.resize(800, 600);plotWidget.show();return app.exec();
}
解释:
• RealTimePlot 类:这是一个自定义的小部件,包含了一个 QwtPlot 和必要的逻辑来追加数据并使用 QwtPlotDirectPainter 实时绘制。
• setupPlot 方法:初始化 QwtPlot 和 QwtPlotCurve,并设置初始的轴范围。
• setupUI 方法:创建一个定时器,每 50 毫秒触发一次 appendData 槽函数。
• appendData 槽函数:生成一个新的数据点,将其添加到 m_samples 中,并使用 QwtPlotDirectPainter 绘制最新的数据点。这里只绘制最后两个点之间的线段,以提高性能。
• QwtPlotDirectPainter:通过 drawSeries 方法直接在画布上绘制新的数据点,而不是重新绘制整个图表。
关键点
• 直接绘制:QwtPlotDirectPainter 提供了直接在画布上绘制的能力,避免了重新绘制整个图表的开销。
• 高效更新:适用于需要频繁更新的场景,比如实时数据显示。
• 局部更新:你可以选择性地只绘制新增或更改的部分,而不需要刷新整个绘图区域。
相关文章:
QWT 之 QwtPlotDirectPainter直接绘制
QwtPlotDirectPainter 是 Qwt 库中用于直接在 QwtPlot 的画布上绘制图形的一个类。它提供了一种高效的方法来实时更新图表,特别适合需要频繁更新的数据可视化应用,例如实时数据流的显示。 使用 QwtPlotDirectPainter 的主要优势在于它可以绕过 QwtPlot 的…...

埃斯顿机器人程序案例多个点位使用变量
多个点位使用变量取放...
【数据分析】贝叶斯定理
文章目录 一、贝叶斯定理的基本形式二、贝叶斯定理的推导三、贝叶斯定理的应用四、贝叶斯定理的优势与挑战 贝叶斯定理(Bayes Theorem)是概率论中的一个重要公式,它提供了一种根据已有信息更新事件发生概率的方式。贝叶斯定理的核心思想是通过…...

学AI编程的Prompt工程,marscode
利用marscode做个创意应用 Datawhale-AI活动 首先把自己的创意告诉marscode,marscode会针对你的创意开始写代码。如果在把创意给marscode前有更好的梳理,会有更好的结果。 对于一个新开始的项目,只需要点击apply进行应用 由于ai的效果不稳定…...
python中的与时间相关的模块
python中的与时间相关的模块 1. time 模块2. datetime 模块3. calendar 模块4. timeit 模块5. pytz 模块6. dateutil 模块参考资料 1. time 模块 time 模块提供了时间相关的函数,主要用于测量时间间隔、获取当前时间、格式化时间等 主要功能 获取当前时间ÿ…...
【Python运维】构建基于Python的自动化运维平台:用Flask和Celery
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代IT运维中,自动化运维平台扮演着至关重要的角色,它能够显著提高运维效率,减少人为错误,并且增强系统的可维护性。本文将引导读者如…...

Qt 12.28 day3
作业: 1】 思维导图 2】 在登录界面的登录取消按钮进行以下设置: 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&a…...
Java爬虫获取速卖通(AliExpress)商品详情
1. 环境准备 在开始编写爬虫之前,需要准备以下环境和工具: Java开发环境:确保你的计算机上安装了Java开发工具包(JDK)。IDE:选择一个Java集成开发环境,如IntelliJ IDEA、Eclipse等。第三方库&…...

Learning Multi-Scale Photo Exposure Correction
Abstract 用错误的曝光捕捉照片仍然是相机成像的主要错误来源。曝光问题可分为以下两类:(i)曝光过度,即相机曝光时间过长,导致图像区域明亮和褪色;(ii)曝光不足,即曝光时间过短,导致图像区域变暗。曝光不足和曝光过度都会大大降低…...
【Rust自学】7.4. use关键字 Pt.1:use的使用与as关键字
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.4.1. use的作用 use的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则,也就是只有公共的部分引入进来才…...
C++ 设计模式:门面模式(Facade Pattern)
链接:C 设计模式 链接:C 设计模式 - 代理模式 链接:C 设计模式 - 中介者 链接:C 设计模式 - 适配器 门面模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个一致&#…...

从0到100:基于Java的大学选修课选课小程序开发笔记(上)
背景 为学生提供便捷的课程选择方式,并帮助学校进行课程管理和资源调配;主要功能包括:课程展示,自主选课,取消选课,后台录入课程,统计每门课程报名情况,导出数据,用户管…...
【算法题解】B. President‘s Office - Python实现
题目描述 Berland的总统办公室内设有多个办公桌,其中总统和其属下各自拥有独特颜色的办公桌。总统希望统计哪些属下的办公桌紧邻他的办公桌,但不记得确切的数量。 输入描述: 第一行包含三个值 n, m, c,分别是办公室的长度、宽度…...
【Spring Boot 】详解
Spring Boot 详解 一、Spring Boot 概述 (一)产生背景 随着 Java 应用的日益复杂,传统 Spring 框架在项目搭建与配置方面愈发繁琐,大量的 XML 配置、依赖管理等工作耗费开发者诸多精力。为解决这些痛点,Spring Boot …...
Redisson 框架详解
目录 一.为什么要使用分布式锁? 二.Redisson 的基本使用: 1.添加 Redisson 依赖: 2.在 application.yml 配置 Redis: 3. 创建 Redisson 客户端: (1)单节点模式: (…...
正确导入MapStruct并避免与Lombok编译冲突的深入分析
正确导入MapStruct并避免与Lombok编译冲突的深入分析 一、MapStruct与Lombok概述 1.1 MapStruct简介 MapStruct是一个代码生成器,它基于约定优于配置的原则,通过注解处理器在编译时自动生成源代码,实现对象之间的属性映射。MapStruct的优势在于减少样板代码,提高开发效率…...
K8S 黑魔法之如何从 Pod 拿到节点的命令行
搞 K8S 运维的时候,偶尔会遇到一个难题,定位到问题出在某个节点上,而由于权限审批,错误配置等等各种原因,没有办法拿到节点的 SSH 权限,无法进入节点命令行进一步排障。 这个时候,就可以用这个…...
【bluedroid】A2dp Source播放流程源码分析(4)
接上集分析:【bluedroid】A2dp Source播放流程源码分析(3)-CSDN博客 蓝牙和AUDIO之间的接口 蓝牙和audio之间的通信是通过socket,管理socket中的文件是UIPC,UIPC管理两条socket。 A2DP_CTRL_PATH /data/misc/bluedroid/.a2dp_ctrl A2DP_DATA_PATH /data/misc/bluedroid…...

计算机网络 (9)数据链路层
前言 计算机网络中的数据链路层(Data Link Layer)是OSI(开放系统互连)参考模型中的第二层,位于物理层和网络层之间。它在物理层提供的服务基础上,负责在相邻节点之间建立、维护和终止链路,确保数…...

kubernetes学习-集群搭建部署(一)
一、开三台虚拟机进行试验(centos7) 1、初始操作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 关闭selinux sudo sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时# 关闭swap sudo swapoff -a # 临时 s…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...