当前位置: 首页 > news >正文

【QT】常用类

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:QT

在这里插入图片描述


目录

  • 👉🏻QMediaPlayer
  • 👉🏻QMediaPlaylist
    • setPlaybackMode
  • 👉🏻QDir
  • 👉🏻QFileDialog
  • 👉🏻QList
  • 👉🏻QUrl
  • 👉🏻QNetworkAccessManager
  • 👉🏻QNetworkRequest、QNetworkReply

👉🏻QMediaPlayer

🍎 基本功能

QMediaPlayer 是 Qt 框架中的一个类,用于处理音频和视频的播放。它提供了以下基本功能:

  • 播放音频和视频:能够播放各种格式的音频和视频文件。
  • 控制播放:支持播放、暂停、停止、快进、快退等控制功能。
  • 媒体信息获取:可以获取播放媒体的时长、当前播放位置等信息。
  • 音量和播放速度控制:能够设置音量和播放速度。
  • 播放状态监控:能够响应播放状态的变化,如播放完成、错误发生等。

🍎 常用方法

以下是 QMediaPlayer 的一些常用方法及其功能:

  • play():开始播放媒体。
  • pause():暂停播放。
  • stop():停止播放。
  • setMedia(const QMediaContent &media):设置要播放的媒体内容。
  • setVolume(int volume):设置音量(范围从 0 到 100)。
  • setPlaybackRate(qreal rate):设置播放速度(如 1.0 为正常速度,0.5 为半速,2.0 为双倍速)。
  • currentMedia():获取当前播放的媒体内容。
  • state():获取当前播放状态(如播放中、暂停中、停止中)。
  • duration():获取媒体的总时长(以毫秒为单位)。
  • position():获取当前播放位置(以毫秒为单位)。
  • setPosition(qint64 position):设置播放位置(以毫秒为单位)。

🍎 示例代码

下面是一个简单的示例,展示了如何使用 QMediaPlayer 播放一个音频文件:

#include <QCoreApplication>
#include <QMediaPlayer>
#include <QMediaContent>
#include <QUrl>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建 QMediaPlayer 实例QMediaPlayer *player = new QMediaPlayer();// 设置媒体内容(音频文件路径)QMediaContent media(QUrl::fromLocalFile("/path/to/your/audiofile.mp3"));player->setMedia(media);// 设置音量(范围:0 到 100)player->setVolume(50);// 开始播放音频player->play();// 运行应用程序return a.exec();
}

🍎 进阶用法示例

下面是一个更复杂的示例,展示了如何设置播放速度、控制播放位置以及响应播放状态变化:

#include <QCoreApplication>
#include <QMediaPlayer>
#include <QMediaContent>
#include <QUrl>
#include <QTimer>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMediaPlayer *player = new QMediaPlayer();// 设置媒体内容(音频文件路径)QMediaContent media(QUrl::fromLocalFile("/path/to/your/audiofile.mp3"));player->setMedia(media);// 设置音量player->setVolume(70);// 设置播放速度player->setPlaybackRate(1.5); // 1.5 倍速播放// 开始播放player->play();// 设置定时器用于检查播放状态QTimer *timer = new QTimer();QObject::connect(timer, &QTimer::timeout, [player]() {qDebug() << "Current position:" << player->position();if (player->state() == QMediaPlayer::StoppedState) {qDebug() << "Playback stopped.";}});timer->start(1000); // 每秒检查一次return a.exec();
}

这个示例不仅展示了如何设置播放速度,还使用了定时器来检查播放位置和播放状态。

🍎 注意事项

  • 依赖模块:确保你的 Qt 项目包含了 Qt Multimedia 模块,并在 CMakeLists.txt.pro 文件中进行了正确配置。
  • 平台支持:不同平台对多媒体格式的支持可能有所不同,确保检查 Qt 文档以了解支持的格式和功能。
  • 错误处理:在实际应用中,考虑添加更多的错误处理代码,以提高用户体验和应用的稳定性。

👉🏻QMediaPlaylist

QMediaPlaylist 用于管理和控制多个媒体文件的播放顺序。以下是一些主要功能和常用方法:

基本功能

  • 管理媒体条目:添加、移除和操作播放列表中的媒体条目。
  • 控制播放顺序:设置播放模式,如顺序播放、随机播放或循环播放。
  • 获取播放信息:访问播放列表中的当前媒体和播放位置。

常用方法

  • addMedia(const QMediaContent &content):将媒体文件添加到播放列表。
  • removeMedia(int index):从播放列表中移除指定位置的媒体文件。
  • clear():清空播放列表。
  • setCurrentIndex(int index):设置当前播放的媒体条目索引。
  • next()previous():切换到下一个或上一个媒体条目。
  • setPlaybackMode(QMediaPlaylist::PlaybackMode mode):设置播放模式,如 Sequential, Loop, Random 等。
  • currentIndex():获取当前播放的媒体条目索引。
  • mediaCount():获取播放列表中的媒体条目数量。

示例代码

下面的示例展示了如何使用 QMediaPlaylist 来创建一个播放列表并管理其内容:

#include <QCoreApplication>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QMediaContent>
#include <QUrl>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMediaPlayer *player = new QMediaPlayer();QMediaPlaylist *playlist = new QMediaPlaylist();// 添加媒体到播放列表playlist->addMedia(QMediaContent(QUrl::fromLocalFile("/path/to/audio1.mp3")));playlist->addMedia(QMediaContent(QUrl::fromLocalFile("/path/to/audio2.mp3")));playlist->addMedia(QMediaContent(QUrl::fromLocalFile("/path/to/audio3.mp3")));// 设置播放模式为随机playlist->setPlaybackMode(QMediaPlaylist::Random);// 设置当前播放的索引playlist->setCurrentIndex(0);// 将播放列表设置给播放器player->setPlaylist(playlist);// 开始播放player->play();return a.exec();
}

在这个示例中,我们创建了一个 QMediaPlaylist 对象,添加了几个媒体文件,设置了播放模式为随机,然后将其分配给 QMediaPlayer 进行播放。你可以根据需要调整播放模式和操作播放列表。

setPlaybackMode

  • QMediaPlaylist::Sequential:这是播放模式的一种,意味着播放列表中的媒体将按照它们在列表中的顺序依次播放。当当前媒体播放完毕时,播放器将自动开始播放列表中的下一个媒体,直到播放列表结束。如果播放列表中的所有媒体都播放完毕,播放器将停在最后一个媒体。

  • 其他播放模式

    • QMediaPlaylist::Loop:播放列表中的媒体将重复播放。播放完列表中的所有媒体后,播放器将重新从列表的开头开始播放。
    • QMediaPlaylist::CurrentItemInLoop:当前播放的媒体将被重复播放。播放列表中的其他媒体不会自动播放,直到手动更改。
    • QMediaPlaylist::Random:媒体将在列表中以随机顺序播放。每次播放列表中的媒体顺序都是随机的。

👉🏻QDir

QDir 是 Qt 提供的一个类,用于简化文件和目录的操作。以下是一些常见用法:

  1. 列出目录内容

    QDir dir("/path/to/directory");
    QStringList files = dir.entryList(QDir::Files);
    
  2. 获取文件信息

    QFileInfo fileInfo("/path/to/file");
    QString fileName = fileInfo.fileName();
    qint64 fileSize = fileInfo.size();
    
  3. 创建目录

    QDir dir;
    if (!dir.exists("/path/to/new/directory")) {dir.mkpath("/path/to/new/directory");
    }
    
  4. 删除目录

    QDir dir("/path/to/directory");
    dir.removeRecursively();
    
  5. 重命名文件

    QDir dir("/path/to/directory");
    dir.rename("oldName.txt", "newName.txt");
    

QDir 提供了丰富的功能来管理文件和目录,使文件系统操作更方便。

👉🏻QFileDialog

QFileDialog 是 Qt 提供的一个对话框类,用于让用户选择文件或目录。它支持多种模式和配置选项,可以用于打开、保存、选择目录等操作。以下是一些常见的用法示例:

基本用法

  1. 打开文件对话框

    #include <QFileDialog>
    #include <QWidget>QString openFile(QWidget *parent) {QString fileName = QFileDialog::getOpenFileName(parent, "Open File", "", "Files (*.*);;Text Files (*.txt);;Images (*.png *.jpg)");return fileName;
    }
    
    • parent:对话框的父窗口。
    • "Open File":对话框的标题。
    • "":默认目录路径。
    • "Files (*.*);;Text Files (*.txt);;Images (*.png *.jpg)":文件过滤器,用于筛选可见文件类型。
  2. 保存文件对话框

    #include <QFileDialog>
    #include <QWidget>QString saveFile(QWidget *parent) {QString fileName = QFileDialog::getSaveFileName(parent, "Save File", "", "Text Files (*.txt);;Images (*.png *.jpg)");return fileName;
    }
    
    • parent:对话框的父窗口。
    • "Save File":对话框的标题。
    • "":默认文件路径和名称。
    • "Text Files (*.txt);;Images (*.png *.jpg)":文件过滤器。
  3. 选择目录对话框

    #include <QFileDialog>
    #include <QWidget>QString selectDirectory(QWidget *parent) {QString directory = QFileDialog::getExistingDirectory(parent, "Select Directory", "");return directory;
    }
    
    • parent:对话框的父窗口。
    • "Select Directory":对话框的标题。
    • "":默认目录路径。

高级用法

  1. 设置对话框选项

    QFileDialog dialog(parent);
    dialog.setFileMode(QFileDialog::ExistingFiles); // 允许选择多个文件
    dialog.setNameFilters(QStringList() << "Images (*.png *.jpg)" << "Text Files (*.txt)");
    dialog.setViewMode(QFileDialog::List); // 以列表模式显示文件
    
  2. 响应用户选择

    QFileDialog dialog(parent);
    dialog.setFileMode(QFileDialog::ExistingFiles);
    if (dialog.exec()) {QStringList selectedFiles = dialog.selectedFiles();// 处理选择的文件for (const QString &file : selectedFiles) {qDebug() << file;}
    }
    
    • dialog.exec():显示对话框并等待用户操作。
    • dialog.selectedFiles():返回用户选择的文件列表(如果选择的是多个文件)。

👉🏻QList

QList 是 Qt 框架中的一个模板类,用于存储和管理一组同类型的对象。它类似于标准 C++ 的 std::vectorstd::list,但提供了更多的功能和便利性来处理 Qt 类型的数据。QList 提供了对动态数组的支持,并且可以存储任意类型的对象,只要这些对象是可拷贝的或可移动的。

基本用法

  1. 创建和初始化 QList

    #include <QList>
    #include <QString>QList<QString> stringList; // 创建一个空的 QList 对象
    

    你可以通过初始化列表或 append() 方法来初始化列表:

    QList<int> numberList = {1, 2, 3, 4, 5}; // 使用初始化列表
    
  2. 添加和插入元素

    QList<QString> stringList;
    stringList.append("Hello");    // 在末尾添加元素
    stringList.prepend("World");   // 在开头添加元素
    stringList.insert(1, "Qt");    // 在指定位置插入元素
    
  3. 访问和修改元素

    QString firstItem = stringList.at(0); // 获取第一个元素
    stringList[1] = "Changed"; // 修改第二个元素
    
    • at(index):返回指定索引位置的元素。
    • operator[]:使用下标操作符访问元素(不检查边界)。
  4. 遍历 QList

    for (const QString &str : stringList) {qDebug() << str;
    }
    

    或使用迭代器:

    for (QList<QString>::const_iterator it = stringList.constBegin(); it != stringList.constEnd(); ++it) {qDebug() << *it;
    }
    
  5. 删除元素

    stringList.removeAt(1);  // 删除指定位置的元素
    stringList.removeOne("Qt"); // 删除第一个匹配的元素
    stringList.clear();  // 删除所有元素
    
    • removeAt(index):删除指定索引位置的元素。
    • removeOne(value):删除第一个匹配的元素。
    • clear():清空所有元素。

特性

  • 动态大小QList 是一个动态数组,可以自动调整大小以适应添加或删除的元素。
  • 支持值类型和指针类型:可以存储任意类型的对象,包括 Qt 自带的类型和用户自定义的类型(需要拷贝构造函数和赋值运算符正常工作)。
  • 内存管理:对于存储指针类型的 QList,需要用户负责对象的内存管理。

👉🏻QUrl

QUrl 是 Qt 框架中的一个类,用于处理和操作 URL(统一资源定位符)。它提供了一种简单的方式来解析、构建和修改 URL,并支持处理常见的 URL 组件,如协议、主机、路径和查询参数。

基本用法

  1. 创建和解析 URL

    #include <QUrl>
    #include <QDebug>QUrl url("https://www.example.com:8080/path/to/resource?query=1#fragment");
    

    QUrl 会自动解析 URL 并将其拆分为各个部分。

  2. 访问和修改 URL 组件

    qDebug() << "Scheme:" << url.scheme();  // https
    qDebug() << "Host:" << url.host();      // www.example.com
    qDebug() << "Port:" << url.port();      // 8080
    qDebug() << "Path:" << url.path();      // /path/to/resource
    qDebug() << "Query:" << url.query();    // query=1
    qDebug() << "Fragment:" << url.fragment(); // fragmenturl.setPath("/new/path"); // 修改路径
    
  3. 构建 URL

    QUrl newUrl;
    newUrl.setScheme("http");
    newUrl.setHost("example.com");
    newUrl.setPath("/path");
    newUrl.setQuery("param=value");qDebug() << newUrl.toString(); // http://example.com/path?param=value
    
  4. 处理 URL 编码

    QString encoded = QUrl::toPercentEncoding("This is a test!");
    QString decoded = QUrl::fromPercentEncoding(encoded.toUtf8());
    
    • QUrl::toPercentEncoding():对字符串进行百分号编码。
    • QUrl::fromPercentEncoding():对百分号编码的字符串进行解码。

特性

  • 支持 URL 解析和构建:可以轻松地解析和构建 URL 的各个部分。
  • 支持 URL 编码:处理 URL 编码和解码。
  • 处理相对 URL:可以处理相对 URL 和基于基础 URL 的解析。

示例代码

#include <QCoreApplication>
#include <QUrl>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QUrl url("https://www.example.com:8080/path/to/resource?query=1#fragment");qDebug() << "Original URL:" << url.toString();qDebug() << "Host:" << url.host();qDebug() << "Port:" << url.port();url.setPath("/new/path");url.setQuery("param=value");qDebug() << "Modified URL:" << url.toString();return a.exec();
}

QUrl 提供了一种强大的方式来处理 URL,在 Qt 应用程序中,它非常有用,特别是当涉及到网络操作时。

👉🏻QNetworkAccessManager

QNetworkAccessManager 是 Qt 框架中用于处理网络请求的类。以下是其基本用法:

  1. 创建 QNetworkAccessManager 实例
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  1. 发起网络请求

使用 QNetworkAccessManager 发起请求,可以是 GET、POST、PUT 等。以下示例演示如何发起 GET 请求:

QNetworkRequest request(QUrl("https://example.com"));
QNetworkReply *reply = manager->get(request);
  1. 处理请求结果

连接 QNetworkReply 的信号与槽来处理请求结果:

connect(reply, &QNetworkReply::finished, [=]() {if (reply->error() == QNetworkReply::NoError) {QByteArray responseData = reply->readAll();// 处理响应数据} else {// 处理错误qDebug() << "Error:" << reply->errorString();}reply->deleteLater();
});
  1. 发起 POST 请求

示例代码展示如何发起 POST 请求,并发送数据:

QNetworkRequest request(QUrl("https://example.com/submit"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");QByteArray postData;
postData.append("key1=value1&key2=value2");QNetworkReply *reply = manager->post(request, postData);
  1. 取消请求

你可以通过 QNetworkReply 对象取消请求:

reply->abort();
  1. 管理 SSL 证书(可选)

如果需要自定义 SSL 证书处理,可以使用 QNetworkAccessManager 的 SSL 配置功能:

connect(manager, &QNetworkAccessManager::sslErrors, [](QNetworkReply* reply, const QList<QSslError>& errors) {// 处理 SSL 错误reply->ignoreSslErrors();
});

以上是 QNetworkAccessManager 的基本用法,能够满足大多数网络请求的需求。

👉🏻QNetworkRequest、QNetworkReply

QNetworkRequest

QNetworkRequest 用于定义网络请求的配置,包括 URL、请求头和 SSL 配置等。

  • 创建请求

    QNetworkRequest request(QUrl("https://example.com"));
    
  • 设置请求头

    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    
  • 设置 SSL 配置(可选)

    QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
    request.setSslConfiguration(sslConfig);
    

QNetworkReply

QNetworkReply 用于处理网络请求的响应,包括获取数据、处理错误等。

  • 获取数据

    QByteArray responseData = reply->readAll();
    
  • 处理错误

    if (reply->error() != QNetworkReply::NoError) {qDebug() << "Error:" << reply->errorString();
    }
    
  • 连接信号与槽

    connect(reply, &QNetworkReply::finished, [=]() {if (reply->error() == QNetworkReply::NoError) {QByteArray responseData = reply->readAll();// 处理响应数据} else {qDebug() << "Error:" << reply->errorString();}reply->deleteLater();
    });
    
  • 取消请求

    reply->abort();
    

总结:QNetworkRequest 配置请求,QNetworkReply 处理响应。

相关文章:

【QT】常用类

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;QMediaPlayer&#x1f449;&#x1f3fb;QMediaPlaylistsetPlaybackMode &#x1f449;&#x1f3fb;QDir&#x1f449;…...

从index_put出发全面学习cuda和pytorch技术

一 前言 深感目前对于cuda和pytorch所涉及知识的广度和深度,但一时又不知道该如何去学习,经过多日的考虑,还是决定管中窥豹,从一个算子出发,抽丝剥茧,慢慢学习,把学习中碰到的问题都记录下来,希望可以坚持下去。 二 函数功能描述 【torch算子】torch.index_put和tor…...

浅谈住房城乡建设部科技创新平台布局重点方向

最近住房建设部组织开展住房城乡建设部科技创新平台&#xff08;以下简称部科技创新平台&#xff09;申报工作。详细内容见住房城乡建设部科技创新平台开始申报了 (qq.com)。在这里有4大方向共15个课题。内容见下图&#xff1a; 虽然我是做技术的&#xff0c;但是如何体现创新还…...

调用 write()函数后,如何知道数据是否已经写入磁盘?

在 Linux 中调用 write() 函数后&#xff0c;可以通过以下几种方式来确定数据是否已经写入磁盘&#xff1a; 一、使用同步函数 1. fsync() 函数&#xff1a; - 这个函数会强制将与文件描述符相关的所有修改过的内核缓冲区写入磁盘&#xff0c;并等待直到磁盘 I/O 操作完…...

策略路由与路由策略的区别

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏 华为_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 一、主体不同 二、方式不同 三、规则不同 四、定义和基本概念 一、主体不同 1、路由策略&#xff1a;是为了改…...

从底层原理上理解ClickHouse 中的稀疏索引

稀疏索引&#xff08;Sparse Indexes&#xff09;是 ClickHouse 中一个重要的加速查询机制。与传统数据库使用的 B-Tree 或哈希索引不同&#xff0c;ClickHouse 的稀疏索引并不是为每一行数据构建索引&#xff0c;而是为数据存储的块或部分数据生成索引。这种索引的核心思想是通…...

xtu oj 锐角三角形

锐角三角形 题目描述 n条边&#xff0c;任选3条边&#xff0c;能组成多少个锐角三角形&#xff08;选的边不同就认为是不同的三角形&#xff09;&#xff1f; 输入 第一个是一个整数T(1≤T≤1000)&#xff0c;表示样例的个数。 每个样例占2行&#xff0c;第一行是一…...

MATLAB系列04:循环结构

MATLAB系列04&#xff1a;循环结构 4. 循环结构4.1 while循环4.2 for循环4.2.1 运算的细节4.2.2 break语句和continue语句4.2.3 嵌套循环 4.3 逻辑数组和向量化4.3.1 逻辑数组的重要性4.3.2 用 if/else 结构和逻辑数组创建等式 4.4 总结 4. 循环结构 循环(loop)是一种 MATLAB …...

虹科方案 | 精准零部件测试!多路汽车开关按键功能检测系统

欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #LIN/CAN总线 #零部件测试 #CAN数据 导读 在汽车制造业中&#xff0c;零部件的安全性、功能性和可靠性是确保车辆整体性能的关键。虹科针对车辆零部件的LIN/CAN总线仿真测试&#xff0c;提出了基于虹科Baby-LIN系列产…...

【加密算法基础——AES CBC模式代码解密实践】

AES 解密实践之代码实现 AES 解密使用python脚本比较灵活&#xff0c;但是一定要保证脚本是调试过的&#xff0c;才能在找到正确的密文&#xff0c;密钥&#xff0c;初始向量的情况下&#xff0c;解出正确的明文。但是对于AES解密&#xff0c;命令行无法处理key截断的问题。 实…...

【ViT+Dis】Deepfake Detection Scheme Based on Vision Transformer and Distillation

文章目录 Deepfake Detection Scheme Based on Vision Transformer and Distillationkey points深伪检测检测算法蒸馏法与教师网络实验训练:参数总结Deepfake Detection Scheme Based on Vision Transformer and Distillation 会议:2021 作者: key points 以往基于CNN结…...

maya-vray渲染蒙版

要用一个叫vrayMulWrapper的材质球&#xff0c;把alpha Conterbution调到-1&#xff0c;勾选matte surface启用蒙版物体。...

计网简简单单复习一下

文章目录 基础体系结构(分层模型)为什么要分层?OSI 七层模型?每一层的作用?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议每一层常见协议有哪些?从输入 URL 到页面展示到底发生了什么?URI和URL的区别;forward和redirect的区别DNS作用是什么?D…...

PyQt5-loading-圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…...

RabbitMQ Spring客户端使用

注解声明式队列和交换机 java自带序列化工具类&#xff0c;将java对象序列化为字节数组&#xff0c;用于网络传输。 jdk序列号存在缺陷&#xff0c;&#xff08;不安全&#xff0c;占用空间大等&#xff09; 推荐使用JSON的序列化&#xff1a; springboot扫描包使配置生效&…...

Arduino IDE离线配置第三方库文件-ESP32开发板

简洁版可以使用uget等&#xff0c;将文件下载到对应文件夹下&#xff0c;然后安装。 esp32之arduino配置下载提速 录屏 Arduino IDE离线配置第三方库文件ESP32 资源 Linux https://download.csdn.net/download/ZhangRelay/89749063 第三方开发板 非默认支持的开发板 linu…...

Node.js 安装及项目实践

node.js安装 node安装&#xff0c;选择版本 一直next&#xff0c;或者自己修改路径&#xff0c;添加两个包 选择自己的安装的node的路径&#xff0c;cmd或者winr cmd 显示node与npm的版本号 node -vnpm -v可以跟着这个博客将node安装 2024最新版Node.js下载安装及环境配…...

如何从混合信号中剔除某一信号——Schmidt正交化的使用(信号互相关)

本文仅用作方法记录&#xff0c;不讲详细原理和底层逻辑。 在面对混合的接收信号的情况下&#xff0c;例如接收信号: Y a 1 X 1 a 2 X 2 a 3 X 3 N Ya_1X_1a_2X_2a_3X_3N Ya1​X1​a2​X2​a3​X3​N 假设信号 X 1 X_1 X1​、 X 2 X_2 X2​、 X 3 X_3 X3​在时域和频域上…...

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清&#xff0c;I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写&#xff0c;而IIC是它的另一种表述方式&#xff0c;代表的是同一个意思&#xff0c;即“集成电路间总线”。I2C是一种由飞利浦公司&#xff08;现恩智浦半…...

Servlet学习详解--基本涵盖所有Servlet知识点

目录 一、Servlet二、 Servlet入门2.1. 执行原理2.2. 实现Servlet接口重写其五个方法及其生命周期 三、Request请求对象3.1. 获取请求消息数据3.2. 获取请求头数据3.3. 获取请求体数据3.4. 设置编码3.5. 其他通用功能3.6. 请求转发(Forward)3.7. 转发共享数据 四、Response对象…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...