开源 C++ QT Widget 开发(三)图表--波形显示器

Qt波形显示 Qt显示波形常用的有Qt自带的QChart,还有外加Plotter 一、QChart的用法 1、在Qt的pro中添加QT += charts 2、头文件中添加 #include <QtCharts/QChartView>//显示图表 #include <QGridLayout> #include <QTimer> #include <QSplineSeri... 阅读详情

文章的目的为了记录使用C++ 进行QT Widget 开发学习的经历。临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

 相关链接:

开源 C++ QT Widget 开发(一)工程文件结构-优快云博客

开源 C++ QT Widget 开发(二)基本控件应用-优快云博客

开源 C++ QT Widget 开发(三)图表--波形显示器-优快云博客

开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑-优快云博客

 开源 C++ QT Widget 开发(五)通讯--串口调试-优快云博客

开源 C++ QT Widget 开发(六)通讯--TCP调试-优快云博客

开源 C++ QT Widget 开发(七)线程--多线程及通讯-优快云博客

开源 C++ QT Widget 开发(八)网络--Http文件下载-优快云博客

开源 C++ QT Widget 开发(九)图表--仪表盘-优快云博客

开源 C++ QT Widget 开发(十)IPC进程间通信--共享内存-优快云博客

开源 C++ QT Widget 开发(十一)进程间通信--Windows 窗口通信-优快云博客

开源 C++ QT Widget 开发(十二)图表--环境监测表盘-优快云博客

开源 C++ QT Widget 开发(十三)IPC通讯--本地套接字 (Local Socket)

开源 C++ QT Widget 开发(十四)多媒体--录音机

开源 C++ QT Widget 开发(十五)多媒体--音频播放


推荐链接:

开源 java android app 开发(一)开发环境的搭建-优快云博客

开源 java android app 开发(二)工程文件结构-优快云博客

开源 java android app 开发(三)GUI界面布局和常用组件-优快云博客

开源 java android app 开发(四)GUI界面重要组件-优快云博客

开源 java android app 开发(五)文件和数据库存储-优快云博客

开源 java android app 开发(六)多媒体使用-优快云博客

开源 java android app 开发(七)通讯之Tcp和Http-优快云博客

开源 java android app 开发(八)通讯之Mqtt和Ble-优快云博客

开源 java android app 开发(九)后台之线程和服务-优快云博客

开源 java android app 开发(十)广播机制-优快云博客

开源 java android app 开发(十一)调试、发布-优快云博客

开源 java android app 开发(十二)封库.aar-优快云博客

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-优快云博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-优快云博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-优快云博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-优快云博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-优快云博客

本章主要内容:使用 Qt Charts 模块,通过定时器模拟数据源,动态更新图表,实现了一个简单的波形显示器。

一、基本介绍

该程序创建了一个主窗口,包含一个可以显示两条实时曲线的图表(MyWave)和三个控制按钮(开始、停止、清除)。通过定时器模拟数据源,动态更新图表,实现了一个简单的波形显示器。

需要修改的文件有4个,如下图

三个按钮为代码中生成,不需要特别注意。mywave需要做出单独的文件创建调用,这里需要拉入Widget控件,然后右键进行提升,为mywave。

拉入Widget控件

右键进行提升

设为mywave

二、源码分析

2.1  头文件:mainwindow.h
目的:定义主窗口类 MainWindow。

关键成员:

MyWave *wave;: 指向自定义波形显示部件的指针,是应用程序的核心。

QTimer *timer;: 定时器,用于周期性地触发数据更新,模拟实时数据流。

代码如下图:

2.2  头文件:mywave.h
目的:定义自定义波形显示部件类 MyWave,继承自 QWidget。

核心组件:

QChart *m_chart;: 图表对象,是所有系列和坐标轴的容器。

QChartView *m_chartView;: 用于显示图表的视图部件。

QSplineSeries *m_series1, *m_series2;: 两条平滑曲线系列,用于存储和绘制数据点。

QValueAxis *m_axisX, *m_axisY;: X轴和Y轴,用于定义图表的坐标范围。

数据管理:

QList<qreal> m_data1, m_data2;: 两个链表,用于在内存中存储接收到的所有数据(用于回放或缩放等功能,但当前实现主要用于管理显示点数)。

int m_maxDisplayPoints = 200;: 控制图表上最大显示的数据点数,实现“滑动窗口”效果。

qreal m_xCounter = 0;: 一个不断递增的计数器,作为每个新数据点的X坐标。

公有接口 (API):

提供了一系列 set... 方法(如 setYRange, setLine1Color),这使得在 MainWindow 中配置波形显示的外观和行为非常方便,体现了良好的可定制性。

appendData(): 最重要的方法,用于向图表追加新的数据点。

clearData(): 清除所有数据。

代码如下图:

3. 源文件:mainwindow.cpp
构造函数:

初始化UI:

创建 MyWave 实例 wave 并对其进行详细配置(大小、范围、标题、颜色等)。

创建按钮,并设置了统一的样式表 (QSS) 使其美观。

使用 QVBoxLayout 和 QHBoxLayout 进行布局管理。

初始化定时器:

创建 QTimer 实例 timer。

连接定时器的 timeout() 信号到一个 Lambda 表达式,该表达式生成正弦和余弦数据(qSin, qCos)并调用 wave->appendData()。phase1 和 phase2 是静态变量,用于保持相位连续,使波形平滑变化。

代码如下图:

4. 源文件:mywave.cpp

核心方法 appendData():

将新数据 yValue1 和 yValue2 分别添加到 m_data1 和 m_data2 列表的末尾。

递增X轴计数器 m_xCounter。

滑动窗口逻辑:检查数据列表大小是否超过 m_maxDisplayPoints。如果超过,则移除列表最先加入的数据(removeFirst()),保持列表长度固定,从而实现图表只显示最新的一段数据。

调用 updateChart() 刷新显示。

核心方法 updateChart():

性能关键:这是代码中最高效的部分。它没有使用 clear() 再逐个 append(),而是先将要显示的所有点准备在 QVector<QPointF> 中,然后一次性调用 QSplineSeries::replace()。这极大地减少了绘图开销,非常适合实时数据更新。

计算当前显示的X轴起始位置 (startX)。

遍历数据列表,为每个Y值创建对应的点(X坐标为 startX + i)。

用准备好的点集替换整个系列的数据。

根据 startX 和 m_maxDisplayPoints 调整X轴的范围,使视图跟随数据滑动。

resizeEvent():

确保当 MyWave 部件大小改变时,内部的 m_chartView 也随之改变,充满整个客户区。

代码如下图:

三、所有源码

3.1  mainwindow.h文件源码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>

class MyWave;

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    MyWave *wave;
    QTimer *timer;
};

#endif // MAINWINDOW_H

3.2  mywave.h文件源码

#ifndef MYWAVE_H
#define MYWAVE_H

#include <QWidget>
#include <QtCharts>

QT_CHARTS_USE_NAMESPACE

class MyWave : public QWidget
{
    Q_OBJECT

public:
    explicit MyWave(QWidget *parent = nullptr);

    // 设置方法
    void setSize(const QSize &size);
    void setXRange(qreal min, qreal max);
    void setYRange(qreal min, qreal max);
    void setAxisTitle(const QString &xTitle, const QString &yTitle);
    void setBackgroundColor(const QColor &color);
    void setLine1Color(const QColor &color);
    void setLine2Color(const QColor &color);
    void setMaxDisplayPoints(int count);
    void appendData(qreal yValue1, qreal yValue2);
    void clearData();

protected:
    void resizeEvent(QResizeEvent *event) override;

private:
    void updateChart();

    QChart *m_chart;
    QChartView *m_chartView;
    QSplineSeries *m_series1;
    QSplineSeries *m_series2;
    QValueAxis *m_axisX;
    QValueAxis *m_axisY;

    QList<qreal> m_data1;
    QList<qreal> m_data2;
    int m_maxDisplayPoints = 200;
    qreal m_xCounter = 0;
};

#endif // MYWAVE_H

3.3  mainwindow.cpp文件源码

#include "mainwindow.h"
#include "mywave.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    // 创建波形控件
    wave = new MyWave(this);
    wave->setSize(QSize(600, 300));
    wave->setXRange(0, 100);
    wave->setYRange(-10, 10);
    wave->setAxisTitle("时间", "数值");
    wave->setLine1Color(Qt::blue);
    wave->setLine2Color(Qt::red);
    wave->setMaxDisplayPoints(100);

    // 创建按钮控件
    QPushButton *startButton = new QPushButton("开始", this);
    QPushButton *stopButton = new QPushButton("停止", this);
    QPushButton *clearButton = new QPushButton("清除", this);

    // 设置按钮样式
    QString buttonStyle = "QPushButton {"
                         "  padding: 8px 16px;"
                         "  font-size: 14px;"
                         "  min-width: 80px;"
                         "  border-radius: 4px;"
                         "  background-color: #f0f0f0;"
                         "}"
                         "QPushButton:hover {"
                         "  background-color: #e0e0e0;"
                         "}";
    startButton->setStyleSheet(buttonStyle);
    stopButton->setStyleSheet(buttonStyle);
    clearButton->setStyleSheet(buttonStyle);

    // 创建水平布局放置按钮
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->addWidget(startButton);
    buttonLayout->addWidget(stopButton);
    buttonLayout->addWidget(clearButton);
    buttonLayout->addStretch();
    buttonLayout->setSpacing(10);

    // 创建垂直主布局
    QVBoxLayout *mainLayout = new QVBoxLayout();
    mainLayout->addLayout(buttonLayout);
    mainLayout->addWidget(wave);
    mainLayout->setContentsMargins(20, 20, 20, 20);
    mainLayout->setSpacing(15);

    // 设置中央部件
    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(mainLayout);
    setCentralWidget(centralWidget);
    this->setFixedSize(1200, 800);

    // 定时器用于模拟数据
    timer = new QTimer(this);
    bool isRunning = false;

    // 按钮信号连接
    connect(startButton, &QPushButton::clicked, [=, &isRunning]() {
        if (!isRunning) {
            timer->start(100);
            isRunning = true;
        }
    });

    connect(stopButton, &QPushButton::clicked, [=, &isRunning]() {
        timer->stop();
        isRunning = false;
    });

    connect(clearButton, &QPushButton::clicked, [this]() {
        wave->clearData();
    });

    connect(timer, &QTimer::timeout, [this]() {
        static qreal phase1 = 0;
        static qreal phase2 = 0;
        wave->appendData(
            qSin(phase1) * 10,
            qCos(phase2) * 8
        );
        phase1 += 0.1;
        phase2 += 0.15;
    });
}

MainWindow::~MainWindow()
{
    delete timer;
    delete wave;
}

3.4  mywave.cpp文件源码

#include "mywave.h"

MyWave::MyWave(QWidget *parent) : QWidget(parent)
{
    // 初始化图表
    m_chart = new QChart();

    // 初始化两条曲线
    m_series1 = new QSplineSeries();
    m_series2 = new QSplineSeries();
    m_chart->addSeries(m_series1);
    m_chart->addSeries(m_series2);

    // 初始化坐标轴
    m_axisX = new QValueAxis();
    m_axisY = new QValueAxis();
    setXRange(0, 200);
    setYRange(-10, 10);

    // 添加坐标轴
    m_chart->addAxis(m_axisX, Qt::AlignBottom);
    m_chart->addAxis(m_axisY, Qt::AlignLeft);
    m_series1->attachAxis(m_axisX);
    m_series1->attachAxis(m_axisY);
    m_series2->attachAxis(m_axisX);
    m_series2->attachAxis(m_axisY);

    // 默认样式
    setBackgroundColor(Qt::white);
    setLine1Color(Qt::blue);
    setLine2Color(Qt::red);
    m_chart->legend()->setVisible(true);
    m_series1->setName("曲线1");
    m_series2->setName("曲线2");
    m_chart->legend()->setAlignment(Qt::AlignBottom);

    // 初始化视图
    m_chartView = new QChartView(m_chart, this);
    m_chartView->setRenderHint(QPainter::Antialiasing);
    setSize(QSize(800, 400));
}

void MyWave::setSize(const QSize &size)
{
    this->resize(size);
    m_chartView->resize(size);
}

void MyWave::setXRange(qreal min, qreal max)
{
    m_axisX->setRange(min, max);
    m_axisX->setTickCount(10);
}

void MyWave::setYRange(qreal min, qreal max)
{
    m_axisY->setRange(min, max);
    m_axisY->setTickCount(10);
}

void MyWave::setAxisTitle(const QString &xTitle, const QString &yTitle)
{
    m_axisX->setTitleText(xTitle);
    m_axisY->setTitleText(yTitle);
}

void MyWave::setBackgroundColor(const QColor &color)
{
    m_chart->setBackgroundBrush(QBrush(color));
    m_chart->setBackgroundPen(QPen(color));
}

void MyWave::setLine1Color(const QColor &color)
{
    m_series1->setPen(QPen(color, 2));
}

void MyWave::setLine2Color(const QColor &color)
{
    m_series2->setPen(QPen(color, 2));
}

void MyWave::setMaxDisplayPoints(int count)
{
    m_maxDisplayPoints = count;
    setXRange(0, count);
}

void MyWave::appendData(qreal yValue1, qreal yValue2)
{
    m_data1.append(yValue1);
    m_data2.append(yValue2);
    m_xCounter++;

    if (m_data1.size() > m_maxDisplayPoints) {
        m_data1.removeFirst();
        m_data2.removeFirst();
    }

    updateChart();
}

void MyWave::clearData()
{
    m_data1.clear();
    m_data2.clear();
    m_xCounter = 0;
    m_series1->clear();
    m_series2->clear();
    updateChart();
}

void MyWave::updateChart()
{
    QVector<QPointF> points1, points2;
    qreal startX = qMax(0.0, m_xCounter - m_maxDisplayPoints);

    for (int i = 0; i < m_data1.size(); ++i) {
        points1.append(QPointF(startX + i, m_data1.at(i)));
        points2.append(QPointF(startX + i, m_data2.at(i)));
    }

    m_series1->replace(points1);
    m_series2->replace(points2);
    m_axisX->setRange(startX, startX + m_maxDisplayPoints);
}

void MyWave::resizeEvent(QResizeEvent *event)
{
    m_chartView->resize(event->size());
    QWidget::resizeEvent(event);
}

四、演示效果

Qt实时波形绘图(使用QCustomPlot) 对于初学者而言,想要及时地做出一套上位机或实时波形显示界面,还是存在一定难度的,为了降低初学者的学习难度,亦方便其他研发人员的使用,我分享一套使用简单、功能强大的实时波形绘制控件,其基于Qt5与QCustomPlot实现。 阅读详情

相关推荐

QT实现动态波形的实时显示

QT上实现动态波形的显示,使用定时器来模拟数据的变化,在qt界面上实时显示当前的数值变化,可以通过波形更加清晰直观的了解数据的变化趋势。

C++ Qt进阶之复杂控件自定义

要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓?通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我闭着眼睛都能写出来的境界。

Qt的QChart实现波的动态显示

1、实现波的动态显示 2、显示坐标 3、能放大和缩小界面 4、能拖动界面

Qt展示动态波形

Qt展示动态波形。

fredricen的专栏 8817

KiCad 7.0 + 嘉立创打样:从原理图到实物,打造你的双LLCC68 LoRa串口透传板

本文详细介绍了使用KiCad 7.0设计双LLCC68 LoRa串口透传板的完整流程,从原理图设计到嘉立创打样。重点解析了AVR+LLCC68组合的优势、双模块布局的电磁兼容设计、SPI接口配置及射频走线技巧,并提供了实测数据和常见问题解决方案,帮助开发者高效实现物联网设备的低功耗远距离通信。

weixin_28693447的博客 260

模电实验室:手把手教你调试共射放大电路静态工作点(避免波形失真)

本文详细介绍了共射放大电路静态工作点的调试方法,帮助避免波形失真问题。从实验准备、电路搭建到静态工作点测量,提供了实用的电阻选值策略和常见波形失真解决方案,适合电子相关专业学生和硬件工程师参考学习。

weixin_42531128的博客 375

开源 C++ QT Widget 开发(十二)图表--环境监测表盘

本文记录了一个使用C++和QTWidget开发的环境监测面板应用。该应用包含温度、湿度、PM2.5等数据的实时监测功能,通过圆形仪表盘和卡片式布局展示数据。核心代码实现了抗锯齿渲染、自定义控件(GaugeWidget和DataCardWidget)以及定时器系统管理数据刷新。文章详细介绍了功能介绍、代码分析和实现效果,并提供了相关开发系列文章的优快云博客链接,包括QTWidget、Android和C#.net MVC等开发教程。

ajassi2000的博客 1113

CSI Tools 工具的安装 Intel 5300 + Ubuntu14.04

在 ubuntu14 系统上面安装 CSI Tools,2020最新教程,亲测可用,只要保证和我做法一致绝对可以安装好。

WS的小屋 1万+

开源 C++ QT Widget 开发(九)图表--仪表盘

本文介绍了一个基于Qt框架实现的仪表盘控件开发。该控件具有黑色背景与亮蓝色刻度、指针和文字的外观设计,包含270度圆弧显示范围,支持设置量程范围、警告值和单位显示。核心功能包括绘制背景渐变、刻度线、数字显示、指针和警告区域。通过QPainter实现精准绘制,并提供setValue()等接口控制显示内容。文章详细解析了仪表盘的几何参数计算、坐标转换方法和绘制逻辑,并附完整源码,可作为Qt仪表盘开发的参考实现。

ajassi2000的博客 1276

AUTOSAR 3万字面试题全面解析(持续更新)

ECU抽象层(EAL)是AUTOSAR架构中的一部分,它位于微控制器抽象层(MCAL)之下,但通常与MCAL一起被提及。EAL的目标是提供一个统一的接口来访问和管理ECU(Electronic Control Unit,电子控制单元)的硬件资源,包括处理器、存储器和外围设备。通过这种抽象,EAL使得上层软件能够以一种标准化的方式与ECU硬件交互,而不需要关心具体的硬件实现细节。EAL解决了硬件异构性带来的问题,即不同ECU可能采用不同类型的处理器和硬件配置。

大模型大数据攻城狮的专栏 5609

一种白平衡增益计算中白点权重计算简易实现方式

一种白平衡白点距离权重简易实现方式

大熊 384

开源 C++ QT Widget 开发(一)工程文件结构

本文记录了使用C++进行QTWidget开发的要点,主要包含QT项目的核心文件结构和编译流程。核心文件包括.pro项目配置文件、main.cpp入口文件、UI设计文件(.ui)、资源文件(.qrc)等。文章详细说明了.pro文件的作用和示例配置,介绍了Qt应用程序从设计到编译的完整过程,包括uic将.ui文件转换为头文件、rcc处理资源文件、moc生成元对象代码等关键步骤。最后还提到了项目构建后生成的目录结构和各类中间文件。

ajassi2000的博客 1419

GJB 5000B二级-II实施基础

本文主要描述GJB 5000B二级II实施基础与GJB 5000A的变化情况,以及过程域各条款的实施要点

Abel的博客 2581

开源 C++ QT Widget 开发(二)基本控件应用

本文记录了一个基于Qt Widgets的C++ GUI应用程序开发过程。文章详细介绍了实现的功能:1)定时器驱动的进度条自动更新;2)按钮点击计数器;3)单选/复选框状态显示;4)下拉框选择显示;5)列表项点击显示。重点分析了Qt信号槽机制的使用方法,包括自动生成槽函数和手动连接信号槽两种方式。虽然程序功能完整,但作者指出存在使用全局变量和过时语法的问题,建议优化代码结构。文章附有完整的.h和.cpp源码,为Qt初学者提供了实用的开发示例。

ajassi2000的博客 1200

Docker:快速部署 Temporal 工作流引擎的技术指南

Temporal是一个开源的分布式工作流引擎,适用于复杂业务流程(如订单处理、支付流程等),提供状态持久化、自动重试、多语言SDK支持等特性。部署简单,支持Docker Compose,包含核心服务、Web UI及数据库。以TypeScript为例,开发者可快速编写工作流(如订单处理)和Worker,通过CLI或SDK启动和管理。Temporal简化了分布式系统的可靠性设计,适合电商、自动化任务等场景。

木头 641

数控系统(CNC)系列:Fanuc 31i-B_(5).基本操作与编程

Fanuc 31i-B 系统使用 G 代码和 M 代码进行编程。G 代码主要用于控制机床的运动,M 代码用于控制辅助功能,如冷却液开关、主轴启动等。G 代码:用于指定机床的运动方式。例如,G00 用于快速定位,G01 用于直线插补,G02 用于顺时针圆弧插补,G03 用于逆时针圆弧插补。M 代码:用于控制机床的辅助功能。例如,M03 用于启动主轴顺时针旋转,M05 用于停止主轴,M08 用于开启冷却液,M09 用于关闭冷却液。

2401_87715305的博客 1766

开源 C++ QT Widget 开发(十五)多媒体--音频播放

本文介绍了使用C++和Qt框架开发的WAV音频播放器。该播放器基于QMediaPlayer实现,主要功能包括音频播放控制、进度显示、状态监控和错误处理。文章详细分析了核心代码,包括文件检查、播放控制、进度更新和日志系统等模块的实现。播放器界面简洁直观,包含播放按钮、进度条、时间显示和日志窗口。项目源码完整展示了Qt多媒体开发的基本流程和技术要点,可作为Qt音频应用开发的参考案例。

ajassi2000的博客 1265

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

开源 C++ QT Widget 开发(十六)程序发布

本文记录了使用C++进行QTWidget开发的打包分发流程。主要内容包括:1)制作程序图标,通过图片转换工具生成ico文件并添加到QT工程;2)详细打包流程六步骤:编译Release版本、创建发布目录、使用windeployqt工具部署依赖、补充资源文件、纯净测试、最终打包分发;3)具体操作演示,包括选择匹配的MinGW编译器、拷贝exe文件、执行windeployqt命令等关键环节。文章特别强调必须使用Release模式编译,并提供了完整的打包检查清单和注意事项,确保QT应用程序能正确运行于未安装开发环境

ajassi2000的博客 933

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑

本文介绍了使用C++和QTWidget开发二进制文件编辑器的过程。主要内容包括:1)二进制文件的优势(高效存储、随机访问、跨平台兼容);2)编辑器功能(文件打开/保存、十六进制显示、基本编辑);3)核心代码分析(文件读写、数据格式转换);4)完整源码实现(MainWindow类处理文件操作)。该工具可用于查看和编辑二进制数据,每行显示16字节,支持偏移地址显示和8字节分组。文章还提供了相关开发系列教程的参考链接。

ajassi2000的博客 947

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

开源 C++ QT Widget 开发(六)通讯--TCP调试

本文介绍了使用C++和QTWidget开发TCP调试工具的过程。该工具支持Server/Client两种模式,可设置IP和端口参数,支持文本和16进制数据收发。文章详细解析了UI设计(包含TCP配置区、接收区和发送区)和核心功能实现(网络连接管理、数据处理等),并提供了完整的源码(mainwindow.h/cpp和.pro工程文件)。该工具具有实时数据收发、多客户端支持、16进制与文本格式切换等功能,适用于TCP通讯调试场景。

ajassi2000的博客 1008

开源 C++ QT Widget 开发(五)通讯--串口调试

本文记录了使用C++进行QTWidget开发串口调试工具的学习过程。文章详细介绍了串口配置、数据收发等核心功能模块的实现,包括串口参数设置(波特率、校验位等)、16进制数据转换、实时通信监控等关键技术点。通过完整的代码展示(包含.h和.cpp文件)和界面效果说明,分享了基于QTWidget开发串口工具的具体实现方法。该工具支持文本/16进制双模式收发,可用于工业控制、智能设备调试等场景,具有参数可调、数据验证等功能特点。

ajassi2000的博客 1326

开源 C++ QT Widget 开发(十四)多媒体--录音机

这篇文章记录了使用C++和QTWidget开发音频录音机应用程序的过程。主要内容包括:1) 功能介绍,实现16kHz采样率、16位深度的PCM音频录制和WAV文件保存;2) 核心代码分析,详细讲解了音频输入设置、录音控制、WAV文件头生成等关键功能;3) 完整的项目源码和UI设计。该应用具有简洁的用户界面,支持录音时长显示、进度条更新和日志记录功能,能够自动处理不支持的音频格式并生成符合标准的WAV文件。

ajassi2000的博客 803

开源 C++ QT Widget 开发(七)线程--多线程及通讯

本文记录了使用C++进行QTWidget开发时实现多线程通信的示例。通过创建MyThread和SecondThread两个子线程,展示了线程间通信的三种方式:子线程→主线程(通过信号槽机制)、子线程→子线程(直接信号连接)。两个线程分别以100ms和1000ms的间隔发送时间信号,并实现了数据传递功能。文中详细分析了线程类定义、信号槽连接方式以及执行流程,并提供了完整的源码实现,包括主窗口类、两个线程类的头文件和实现文件。

ajassi2000的博客 983

开源 C++ QT Widget 开发(十三)IPC通讯--本地套接字 (Local Socket)

本文介绍了使用C++和QTWidget进行本地进程间通信(IPC)的开发实践,重点讲解了命名管道(QLocalServer/QLocalSocket)的实现方法。文章包含服务器端和客户端的完整代码分析,涵盖连接管理、错误处理、状态管理、通信协议等关键技术要点。服务器端通过监听唯一名称实现连接管理,客户端支持异步连接和断开操作。文中详细说明了UTF-8编码、资源释放顺序、跨版本兼容等注意事项,并提供了完整的项目源码和显示效果。该方案适用于需要可靠双向通信的场景,如主程序与插件或辅助工具间的交互。

ajassi2000的博客 1615

开源 C++ QT Widget 开发(十一)进程间通信--Windows 窗口通信

本文记录了使用C++ QTWidget开发跨进程通信功能的学习过程。通过WM_COPYDATA消息机制实现窗口间数据传输,包含发送端和接收端两个程序。发送端通过FindWindow查找目标窗口并使用SendMessage发送消息,接收端通过nativeEvent处理消息。文中详细分析了代码结构,包括数据准备、消息发送和处理逻辑,并提供了完整的源码实现。该功能基于Windows消息机制,实现了简单的生产者-消费者模型,可用于进程间通信。

ajassi2000的博客 1076

开源 C++ QT Widget 开发(八)网络--Http文件下载

本文记录了使用C++进行QTWidget开发网络文件下载器的学习过程。通过QNetworkAccessManager处理HTTP请求,实现了文件下载、进度显示、取消下载及重定向处理等功能。核心类DownloadTool封装了下载逻辑,包括自动创建目录、文件重命名、错误处理等特性。文章详细分析了源码结构,包括头文件设计、主要功能实现和关键细节,并提供了完整代码示例。最终实现了一个简单的界面程序,能够成功下载文件并实时显示进度。

ajassi2000的博客 1017
上一篇: 开源 C++ QT Widget 开发(二)基本控件应用
下一篇: 开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑
ajassi2000
博客等级 码龄22年 2034粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值