VS+QT中使用多媒体定时器+qcustomplot绘制动态曲线

【Qt】解决QCustomPlot实时绘图时数据不断累积的问题 在使用QCustomPlot实时绘图时,随着数据量的增加,内存消耗也会不断增大,需要注意删除前面的数据。 在v1.x版本中可直接通过```QCPGraph::removeDataBefore(int x)```来实现;但在在v2.x版本中,取消了该函数,但可通过修改源码的方式再现。 阅读详情

VS2017+QT5.9.2中使用多媒体定时器+qcustomplot绘制动态曲线

  VS2017+QT5.9.2中使用多媒体定时器+qcustomplot绘制动态曲线,从环境搭建到程序打包发布的一个相对完整的流程。定时器的精度实际没有测试,按我参考的博主的说法应该是ms级别的,我实际使用的时候是定时2ms。
  也是初学QT的小白,下面的操作可能也不是很规范。都是按实际操作经验总结瞎掰出来,最后应该还是能用吧。

1. VS2017+QT5.9.2的配置

  对于VS+QT的环境配置网上相关的教程比较多,这里就不再赘述。
  对于这一部分,我也没用参考什么教程,就直接无脑安装,先安装QT5.9.2,好像是全部勾选(但可能有点组件并不需要),最终大小为12G左右;然后在安装VS2017社区版,我安装的时候也是无脑选择前面三个组件,或许QT开发不需要这么多,需要注意的是C++通用windows平台工具是必要的,默认似乎不会勾选这个选项,然后等待它安装成功,大概有20G吧。

在这里插入图片描述
  然后在VS中配置QT环境,在 工具>扩展和更新>联机 中搜索QT,然后就可以看见QT Visual Studio Tools,点击下载即可,然后关闭VS2017后会弹出一个更新界面,点击 修改 就安装成功了,重新打开VS2017,界面的选项栏就会多一个 QT VS Tools 的选项,点击该选项,点击 Qt Options,在其中添加安装QT的路径对应的编译器。

在这里插入图片描述
  我对应是这样的路径 C:\Qt\Qt5.9.6\5.9.6\msvc2017_64,然后点击确定就基本完成了。

在这里插入图片描述

2. QT工程的创建

  在配置好环境后,在VS2017中新建项目时,就会在 Visual C++ 中多出一个 QT 的选项。

在这里插入图片描述
  我们选择QT的窗体程序,命名为qt_demo,新建工程。之后还会弹出一些关于QT基本设置的窗体选项,主要在于下面这个选项配置。

在这里插入图片描述
  我们选择debug,然后 QT Version 就现在之前配置的 msvc2017_64,然后对于Qt Modules 默认会帮你选上三个必要的module,点击那个表格框,就会弹出全部的选项。

在这里插入图片描述
  对于我需要实现的动态绘图功能,QT官方有一个 Charts 的库,但是用过后感觉很一般吧,点数多的时候,刷新频率就不能太快,论坛上面说似乎只有50hz吧。所以这里没有勾选它。然后一路 Next Finish,QT工程就创建完毕了。
  最后,需要留意的是工程对应的SDK版本,在项目上 右键>属性>配置属性>常规 中查看,SDK版本需要换为 SDK10。(另外,由于我电脑里面同时装了VS2013和VS2017,所以在平台工具集会默认选择2013,需要自己手动换成2017)。

在这里插入图片描述

3. 导入多媒体定时器和qcustomplot

3.1 多媒体定时器

  由于甲方的需要,我需要一个大概2ms的定时器,虽然QT里面自带定时器控件,但是定时精度似乎只有20ms,然后解决方案是调用Windows的多媒体定时器来达到ms精度的定时功能。我参考这位博主的方法,十分感谢这位博主:
  Qt之高精度多媒体定时器:https://blog.youkuaiyun.com/iliukunpeng/article/details/79211201
  直接根据这个博文,建立相应的头文件和源文件,我命名为了performancetimer,将它们放入项目文件夹中,然后将它们添加到项目中即可。
  经过个人的实践,在纯QT环境中,可以直接使用,但是需要在工程对应的 .pro 文件中添加 LIBS += -lwinmm ,添加这个库才可以编译成功使用。

LIBS += -lwinmm

  在VS+QT的环境中,上述博文中头文件中的

friend WINAPI void  CALLBACK PeriodCycle(uint,uint,DWORD_PTR,DWORD_PTR,DWORD_PTR);
// 需要替换为
friend void WINAPI CALLBACK PeriodCycle(uint,uint,DWORD_PTR,DWORD_PTR,DWORD_PTR);

然后在项目的头文件中需要添加 #pragma comment(lib,“Winmm.lib”),来添加对应的库。就可以正常使用了。

// qt_demo.h中
#include "performancetimer.h"
#pragma comment(lib,"Winmm.lib")

3.2 qcustomplot

  对于QT中动态绘图的功能,即我想要的示波器功能不像NI的一些仪器仪表软件封装的那么方便,QT中自带的绘图库QCharts确实不太行(也可能是我不太会使用),然后我选择了第三方绘图库QCustomplot,它的使用和配置都比较方便而且性能也能达到我的需求。
  对于qcustomplot的基本配置网上有很多教程,这里不再赘述。不能说毫无难度,但可以说是非常简单。只需要去qcustomplot官网下载压缩包。好像里面就这么点东西。。。

在这里插入图片描述
  然后将qcustomplot.h和qcustomplot.cpp放入工程文件夹,在将它们添加到工程中,然后还需要添加一个库,在项目上 右键>属性>链接器>输入>附加依赖项 中添加“Qt5PrintSupportd.lib”,然后对应 release 里面是“Qt5PrintSupport.lib”,这里可以顺手添加,不然以后发布程序的时候,忘记这茬事就很尴尬了。。。然后就可以用啦。
  我们小试一波,打开QT界面文件(qt_demo.ui),然后在主界面中拖入一个Widget控件,缩放到合适的大小,点击 右键>提升为…,然后出现如下界面,然后在 提升类的名称:中输入 QCustomPlot(一定要注意大小写哈,不然会很尴尬的,,),点击 添加,然后选中刚刚添加的类,点击 提升。

在这里插入图片描述
  在保存ui文件后,在debug下点击运行,就会出现如下效果了。

在这里插入图片描述
在纯QT环境中,操作也类似,就是对于 printsupport 库的添加方式不太一样,只需要在.pro文件中添加:

QT += printsupport

4. 动态绘图

  对于动态绘图,我的思路就很简单,就是创建两个定时器,一个用于往向量中更新数据,我设置了2ms一次;一个用于刷新绘图,包括更新坐标轴和更新曲线,我设置了100ms一次。然后我在界面中放置了两个示波器,都绘制一个简单的正弦函数,也放置了一些按钮,用了开启和停止定时器,增大和缩小正弦波幅值。最后运行结果大概是这个样子的。

在这里插入图片描述
  我就直接上代码了,主要是qt_demo.h和qt_demo.cpp文件,关键的地方也做了一些必要的注释;剩下就是ui文件,按上图自己搭建就好。然后整个工程文件的下载链接在文末,跳转自行下载哈。
qt_demo.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_qt_demo.h"
#include <qt_windows.h>
#include "performancetimer.h"

#pragma comment(lib,"Winmm.lib")

class qt_demo : public QMainWindow
{
    Q_OBJECT

public:
    qt_demo(QWidget *parent = Q_NULLPTR);

private:
    Ui::qt_demoClass ui;

	PerformanceTimer* timer_chart;
	PerformanceTimer* timer_data;


private slots:
	void on_pushButton_clicked();		// 点击启动绘图
	void on_pushButton_2_clicked();		// 点击停止绘图
	void on_pushButton_3_clicked();		// 点击增大正弦函数幅值
	void on_pushButton_4_clicked();		// 点击减小正弦函数幅值
	void handleTimeout_chart();			// 绘图的定时回调函数
	void handleTimeout_data();			// 控制的定时回调函数
};

qt_demo.cpp

#include "qt_demo.h"
#include "qcustomplot.h"

int timer_interval = 2;				// 数据添加定时器的定时间隔,2ms
float timer_interval_f = timer_interval / 1000.0;
int timer_interval_chart = 100;		// 绘图定时器的定时间隔,100ms

QVector<double> data_x1, data_y1, data_x2, data_y2;

int axisTime = 40;									// 横坐标显示时间长度
int dataSzie = axisTime * 1000 / timer_interval;	// 图标显示点的个数

int flag_axis = 0;					// 是否更新坐标轴的标志位
int counter = 0;					// 数据添加时间的计数器
int counter_chart = 0;				// 绘图计数器

float F = 1.0;

qt_demo::qt_demo(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	QFont font, font_tick;
	font.setPointSize(12);
	font.setWeight(50);
	font_tick.setPointSize(10);

	// 初始化绘图界面
	ui.widget_1->addGraph();					// 加入一条曲线
	ui.widget_1->yAxis->setRange(0, 10);		// 设置横纵坐标轴范围
	ui.widget_1->xAxis->setRange(0, axisTime);
	ui.widget_1->xAxis->setLabel(QStringLiteral("时间/s"));		// 设置横纵坐标轴标签
	ui.widget_1->yAxis->setLabel(QStringLiteral("压力/MPa"));
	ui.widget_1->xAxis->setLabelFont(font);
	ui.widget_1->xAxis->setTickLabelFont(font_tick);
	ui.widget_1->yAxis->setLabelFont(font);
	ui.widget_1->yAxis->setTickLabelFont(font_tick);

	ui.widget_2->addGraph();
	ui.widget_2->yAxis->setRange(0, 10);
	ui.widget_2->xAxis->setRange(0, axisTime);
	ui.widget_2->xAxis->setLabel(QStringLiteral("时间/s"));
	ui.widget_2->yAxis->setLabel(QStringLiteral("压力/MPa"));
	ui.widget_2->xAxis->setLabelFont(font);
	ui.widget_2->xAxis->setTickLabelFont(font_tick);
	ui.widget_2->yAxis->setLabelFont(font);
	ui.widget_2->yAxis->setTickLabelFont(font_tick);

	// 给开始和停止按钮贴图
	QIcon ico("./picture/start.png");
	ui.pushButton->setIcon(ico);
	ui.pushButton->setIconSize(QSize(50, 50));
	ui.pushButton->setFlat(true);

	QIcon ico_stop("./picture/stop.png");
	ui.pushButton_2->setIcon(ico_stop);
	ui.pushButton_2->setIconSize(QSize(50, 50));
	ui.pushButton_2->setFlat(true);


	// 创建多媒体定时器
	timer_chart = new PerformanceTimer(this);
	connect(timer_chart, SIGNAL(timeout()), this, SLOT(handleTimeout_chart()));	// 绑定槽函数

	timer_data = new PerformanceTimer(this);
	connect(timer_data, SIGNAL(timeout()), this, SLOT(handleTimeout_data()));
}

void qt_demo::on_pushButton_clicked()
{
	timer_data->start(timer_interval);
	timer_chart->start(timer_interval_chart);
	ui.pushButton->setEnabled(false);
}

void qt_demo::on_pushButton_2_clicked()
{
	timer_data->stop();
	timer_chart->stop();
	ui.pushButton->setEnabled(true);
}

void qt_demo::on_pushButton_3_clicked()
{
	F = F + 0.1;
}

void qt_demo::on_pushButton_4_clicked()
{
	F = F - 0.1;
}

void qt_demo::handleTimeout_data()
{
	float y1, y2;
	float T;
	T = timer_interval_f * counter;
	y1 = F * sin(T) + 1;
	y2 = F * sin(T) - 1;
	// 添加新的数据进入数据向量
	data_x1.append(T);
	data_y1.append(y1);
	data_x2.append(T);
	data_y2.append(y2);
	// 移除不在显示范围的数据
	if (data_x1.size() > dataSzie)
	{
		data_x1.pop_front();
		data_y1.pop_front();
		data_x2.pop_front();
		data_y2.pop_front();
		flag_axis = 1;
	}
	counter++;
}

void qt_demo::handleTimeout_chart()
{
	float axis_min;
	float axis_max;
	float y_max, y_min;

	// 自动按照y值最大值、最小值更新y轴范围
	y_max = (*(std::max_element(std::begin(data_y1), std::end(data_y1))));
	y_max = y_max>0 ? y_max*1.05 : y_max*0.95;
	y_min = (*(std::min_element(std::begin(data_y1), std::end(data_y1))));
	y_min = y_min>0 ? y_min*0.95 : y_min*1.05;
	ui.widget_1->yAxis->setRange(y_min, y_max);

	y_max = (*(std::max_element(std::begin(data_y2), std::end(data_y2))));
	y_max = y_max > 0 ? y_max * 1.05 : y_max * 0.95;
	y_min = (*(std::min_element(std::begin(data_y2), std::end(data_y2))));
	y_min = y_min > 0 ? y_min * 0.95 : y_min * 1.05;
	ui.widget_2->yAxis->setRange(y_min, y_max);

	// 更新x轴范围
	if (flag_axis == 1)
	{
		axis_min = counter_chart * timer_interval_chart / 1000.0 - axisTime;
		axis_max = counter_chart * timer_interval_chart / 1000.0;
		ui.widget_1->xAxis->setRange(axis_min, axis_max);
		ui.widget_2->xAxis->setRange(axis_min, axis_max);
	}
	// 刷新图表
	ui.widget_1->graph(0)->setData(data_x1, data_y1);
	ui.widget_1->replot();
	ui.widget_2->graph(0)->setData(data_x2, data_y2);
	ui.widget_2->replot();

	counter_chart++;
}

5. 程序的打包发布

  对于VS+QT的程序的打包发布网上也有许多教程,可以参考这个博文:
  VS+Qt应用开发-发布Release程序打包发布:https://blog.youkuaiyun.com/qq_36170958/article/details/108717691
  1、首先把原先的程序使用 release 进行编译,注意!!!原先在debug中添加的库也需要在release里面添加一遍,这个demo里面就只有“Qt5PrintSupport.lib”了。其实使用debug发布也是可以的,可以参考这个博文:vs 项目发布Debug和Release区别。
  2、打开cmd,进入Qt安装目录下对应编译器的bin文件路径,我的是 C:\Qt\Qt5.9.2\5.9.2\msvc2017_64\bin,
  3、输入命令 windeployqt (工程的release路径),例如 windeployqt C:\Users\135\source\repos\qt_demo\x64\Release 回车,即生成成功了,然后工程的release路径中的.exe文件就可以双击运行了。
  4、如果工程使用了一些额外的图片或者dll资源时,也需要把对应的资源复制到.exe所在的文件夹中。这个demo工程里面使用两个贴图,所以也需要将存放图片的picture文件夹复制到.exe文件夹中,不然图片无法正常显示。然后将这个文件夹压缩打包就算结束辽。

6. 相关资料

工程文件的百度云链接:https://pan.baidu.com/s/1aOUrMf93Lfouyl4twCLFcg
提取码:42ia

Qt框架更新解析:从模块依赖到打包部署的C++跨平台开发实战 C++跨平台应用开发框架是现代软件开发中的重要工具,它通过提供统一的API抽象层,实现了“一次编写,到处编译”的核心价值。这类框架通常包含GUI组件、网络通信、数据序列化等模块,其技术价值在于显著提升开发效率,降低多平台适配成本,广泛应用于桌面软件、嵌入式系统、工业控制等领域。在众多解决方案中,Qt以其成熟的元对象系统和信号槽机制脱颖而出。近期Qt官方更新针对开发者长期关注的模块依赖管理和应用部署等痛点进行了优化,例如对xlsx模块安装流程的简化和MSVC编译链配置的改进,使得开发体验更加流畅。这些更新直接 阅读详情

相关推荐

QCustomPlot使用

一、官网下载 QCustomPlot官网下载 从官网下载 qcustomplot.h 和 qcustomplot.cpp 二、加入工程 通过添加现有文件将 qcustomplot.h、qcustomplot.cpp加入工程,并在pro文件中加入printsupport 三、使用

pzs0221的专栏 2万+

Qt之高精度多媒体定时器

当前有许多工程实例需要非常准确的毫秒定时器,然而Qt多提供的QTimer定时器优先级较低,所以其准确性不能满足需求,故本人学习widows中的多媒体定时器自定义了一个高性能定时器的类,经过验证该定时器完全满足需要,且精度为1ms级(如果操作系统中安装的软件少)。本定时器经过实际工控项目时间得知10ms完全没问题,1ms没有试验过。经过测试,moveToThread到一个单独的线程去跑精度确实很高,10ms的时候一开始两三千个数据的误差大致在±1,之后就会保持在±0.2,偶尔一个漂移点大概在±0.5左右。

AlexPopulus的博客 2704

Qt/C++编写自定义控件25-自定义QCustomPlot

一、前言 上次在写大屏数据可视化电子看板系统时候,提到过改造QCustomPlot来实现柱状分组图、横向柱状图、横向分组图、鼠标悬停提示等。这次单独列出来描述,有很多人疑问为啥不用QChart,或者echart等形式,其实这两种方式我都尝试过,比如Qt5.7以后新增的QChart模块,曲线这块,支持数据量很小,而且用法极其不适应,非常别扭,尤其是10W以上数据量的支持,简直是渣渣,优点也是有很多的...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 3430

Qt应用开发(拓展篇)——示波器/图表 QCustomPlot

是一个用于绘图和数据可视化的Qt C++小部件。它没有进一步的依赖关系,提供友好的文档帮助。这个绘图库专注于制作好看的,出版质量的2D绘图,图形和图表,以及为实时可视化应用程序提供高性能。QCustomPlot可以导出各种格式,如矢量化的PDF文件和光栅化的图像,如PNG, JPG和BMP。QCustomPlot是用于在应用程序中显示实时数据以及为其他媒体生成高质量图的解决方案。

波塞冬的博客 4511

基于STM32+Lora设计的粮仓环境监测系统_PCB_416

为解决传统粮仓管理中存在的监测手段落后、数据实时性差、管理效率低下等问题,本项目设计并实现了一套基于STM32和LoRa技术的智能化粮仓环境监测系统。该系统由多个分布式传感器节点和一个中心网关组成,均采用STM32F103C8T6作为主控芯片。节点负责实时采集粮仓内的温度、湿度(SHT30)、粮食水分、二氧化碳及烟雾等多项环境参数,并通过LoRa无线网络将数据发送至网关。网关对数据进行汇聚后,利用Air780e 4G模块以MQTT协议将数据上传至华为云IoT平台。系统支持自动与手动两种控制模式,可根据环境阈

76

Qt多媒体定时器源代码

Qt多媒体定时器的用法,可用于windous操作系统下对实时性要求相对较高的工程

C++开发者如何判断是否学习Qt?就业指南与学习路径解析

C++作为一门广泛应用于系统编程、游戏开发、嵌入式等领域的编程语言,其生态中包含了多种GUI框架和应用程序开发工具。其中,Qt是一个基于C++的跨平台应用程序开发框架,其核心机制包括信号与槽(Signals & Slots)和元对象系统(Meta-Object System),这些机制提供了强大的对象间通信和运行时类型信息能力,是实现复杂、高性能桌面应用和嵌入式图形界面的关键技术。从技术价值看,Qt不仅简化了跨平台GUI开发,还通过其丰富的模块(如网络、数据库、多媒体)提升了开发效率,尤其适用于工业软件、汽

weixin_30797199的博客 455

多通道串口数字示波器,详细信息见博客:Serial Scope——基于QCustomPlot的串口虚拟示波器开发过程

多通道串口数字示波器,详细信息见博客:Serial Scope——基于QCustomPlot的串口虚拟示波器开发过程

Qt开发全攻略:从入门到精通,攻克模块配置、图表绘制与打包发布

C++ GUI开发是构建跨平台桌面应用的核心技术领域,其关键在于理解框架的模块化架构与事件驱动模型。Qt作为该领域的代表性框架,通过信号槽机制实现对象间松耦合通信,提供了从界面设计到系统集成的完整解决方案。在工程实践中,开发者常面临模块依赖管理、图形绘制优化及多线程并发等挑战,这些直接影响应用的稳定性和性能。例如,处理xlsx模块缺失或QChart图表绘制等具体场景时,需掌握.pro文件配置与第三方库集成技巧。本文聚焦Qt学习曲线中的关键节点,通过解析环境配置、核心机制及高频问题,为开发者提供从概念到实战的

weixin_34095889的博客 384

Qt、QCustomPlot、实时波形绘制、实时曲线绘制

讲解见博客:https://blog.youkuaiyun.com/weixin_47488212/article/details/129299987 对于初学者而言,想要及时地做出一套上位机或实时波形显示界面,还是存在一定难度的,为了降低初学者的学习难度,亦方便其他研发人员的使用,笔者分享一套使用简单、功能强大的实时波形绘制控件,其基于Qt5与QCustomPlot实现。 在项目中必须包含QCustomPlot相关文件,笔者这里是直接包含qcustomplot.cpp、qcustomplot.h两个文件。另外在项目的.pro中,必须包含以下这句: QT += widgets printsupport 可以使用代码直接实例化WidgetPlot2D,或通过窗口提升,然后使用WidgetPlot2D绘制实时波形只需两步: ① 初始化波形名称:函数initGraphName(QStringList) ② 给对应的波形添加数据:函数addData(QString, double)

顶会新宠!Gate+Attention创新思路发A会

性能提升:在Places2自然场景和CelebA-HQ人脸数据集上,与以往方法相比,该系统在自由形式掩码修复任务中取得了更高的质量和更低的误差(例如,平均ℓ1误差和ℓ2误差显著降低)。硬件效率提升:Griffin和Hawk在TPU-v3上的训练效率与Transformer相当,且在推理时具有更低的延迟和显著更高的吞吐量。门控卷积:提出了一种新的门控卷积机制,通过学习每个通道在每个空间位置的动态特征选择机制,解决了传统卷积将所有输入像素视为有效像素的问题。

2501_92785035的博客 975

QT实战

http://blog.youkuaiyun.com/column/details/qshare.html

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1326

F5 GTM DNS 实战指南:智能DNS的监控与健康检查机制

本文深入解析F5 BIG-IP GTM智能DNS的核心机制,重点阐述其监控与探针两大功能如何协同工作。监控器负责深度检查服务器应用健康,确保服务可用性;探针则实时测量网络路径质量,实现基于延迟的智能流量调度。文章通过实战配置步骤,指导如何构建逻辑架构、建立iQuery通信、配置业务级健康检查及探针,从而构建高可用、高性能的全局负载均衡解决方案。

weixin_29240711的博客 469

QT跨平台开发框架安装与配置全指南

QT作为跨平台C++ GUI开发框架,通过其强大的信号槽机制和元对象系统实现高效界面开发。其核心价值在于一次编写多平台部署的能力,大幅降低Windows、Linux和macOS多平台适配成本。开发者在工业控制、嵌入式系统和金融交易等领域广泛应用QT框架时,首先需要完成正确的环境安装与配置。本文以QT 5.15.2为例,详细解析Windows平台MSVC编译环境配置、Linux下gcc工具链集成以及macOS的Xcode环境准备等关键技术要点,特别针对国内开发者提供了清华镜像源加速方案。通过正确配置QTDIR

weixin_34234721的博客 435

Flink SQL数据血缘实战:如何用Calcite追踪字段级数据流向(附源码示例)

本文深入探讨了如何利用Apache Calcite解析Flink SQL执行计划,实现字段级数据血缘的追踪。通过扩展Calcite的元数据处理器,特别是针对Flink特有的Snapshot等节点,文章提供了从获取优化后的逻辑计划到提取并可视化血缘关系的完整实战方案,并附有核心源码示例,帮助开发者构建实时数仓的数据治理能力。

weixin_29032337的博客 142

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3790

Qt开发从入门到精通:信号槽、多线程与跨平台实战指南

C++ GUI开发框架为构建跨平台桌面应用程序提供了核心解决方案,其核心机制包括信号与槽通信、事件循环和元对象系统。这些机制通过解耦组件、实现类型安全的通信,为复杂交互逻辑提供了工程化支持,尤其在处理用户界面与后台任务协同方面展现出重要价值。在工业控制、数据可视化、嵌入式系统等应用场景中,框架的稳定性和跨平台能力至关重要。本文聚焦于Qt框架,深入解析信号槽机制原理与多线程编程实践,帮助开发者解决跨线程通信和界面卡顿等高频问题,实现从基础使用到架构设计的进阶。

weixin_30764771的博客 377

Cadence 批量一次性修改title 页码标题

本文介绍如何在Cadence软件中对DSN文件进行标题栏的批量编辑操作,包括选择编辑对象、使用快捷键打开属性面板以及如何修改标题、页码等关键信息。

tianpu2320959696的博客 977

[QT编程系列-42]: QT定时器

timeSetEvent和QTimer是两个不同的定时器机制,分别对应于Windows平台的原生API和Qt框架中的定时器类。timeSetEvent是Windows API提供的函数,用于设置定时器事件。它可以在指定的时间间隔内定期调用一个回调函数。timeSetEvent需要手动设置参数,包括延迟时间、事件分辨率、回调函数等。timeSetEvent是使用C/C++编程语言进行调用和使用。QTimer是Qt框架提供的定时器类,封装了定时器的常用操作。

文火冰糖(王文兵)的博客 6488

基于DPCNN实现电商情感分析任务

下载链接项目中使用的模型是DPCNN,在模型中我们定义了三个组件,分别是embedding层,卷积层和全连接层。Embedding层:将每个词生成对应的嵌入向量,就是利用一个连续型向量来表示每个词卷积层:提取语句中的语义信息Linear层:将结果映射成2大小用于二分类,即正反面的概率。

优快云 精品推荐 1629

Ubuntu零基础入门到精通【4.4讲】:网络、蓝牙、显示器、声音与输入法设置!

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1486

VC++或QT下 高精度 多媒体定时器

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了。如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件"mmsystem.h"和库文 件"winmm.lib"。  虽然Win95下可视化开发工具如VC、Delphi、C++   Builde

System Architect 3517

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

QT绘制实时动态曲线——qcustomplot使用(二)

在QT绘制实时动态曲线——qcustomplot使用(一)中,介绍使用官方的demo实现动态实时曲线。 官方代码移植 针对动态显示数据项目要求,移植官方代码demo 开启绘图的函数 void Widget::setupRealtimeDataDemo(QCustomPlot *customPlot) { customPlot->addGraph(); // red line customPlot->graph(0)->setPen(QPen(Qt::red)); customPlot

梅山 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

QT串口大量数据动态实时显示(三)========“customplot绘图步骤”

前言 在《QT串口动态实时显示大量数据波形曲线(一)》和《QT串口动态实时显示大量数据波形曲线(二)》中介绍了串口编程和chart绘图编程。也介绍了chart和customplot绘图的基本区别。customplot绘图在代码上非常简单,不用点,线,坐标系和图表一层一层的放那么麻烦。 第一部分: 串口接收大量数据动态显示的难点 串口大量数据QT接收时问题的原因: (1)10ms40个8位数。在示波器上监视串口波形,其实这个总线负载率差不多到了60%。如果再想传...

weixin_45426095的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【QCustomPlot】1.4 - 绘制动态曲线、波形图,隐藏曲线graph,鼠标移动拖动、滚轮缩放、点击选中

嵌入式表格 custompot 绘制动态曲线

君君的博客 4908
下一篇: Ubuntu修改静态IP、网关和DNS的方法总结
Somnus、Maybe
博客等级 码龄9年 6粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值