Qt 核心库总结
Qt 核心库(QtCore)
QtCore 是 Qt 框架的基础模块,提供非图形界面的核心功能,是所有 Qt 应用程序的基石。它包含事件循环、信号与槽、线程管理、文件操作、字符串处理等功能,适用于 GUI 和非 GUI 应用程序。本文将从入门到精通,逐步解析 QtCore 的核心功能、使用方法和高级应用,通过具体示例展示其强大能力,帮助你全面掌握 QtCore。
1. QtCore 简介
QtCore 是 Qt 框架的核心库,提供以下关键功能:
- 事件循环:支持应用程序主事件循环,处理定时器、信号等。
- 信号与槽:实现对象间松耦合通信。
- 线程管理:提供多线程支持。
- 字符串和容器:高效的 Unicode 字符串和通用容器类。
- 文件和 I/O:处理文件、目录和流式数据。
- 时间和日期:支持时间戳、定时器和日期操作。
QtCore 不依赖图形界面,适用于服务器、命令行工具和 GUI 应用程序。
2. 环境准备
在开始使用 QtCore 之前,确保配置好开发环境:
- 安装 Qt:下载并安装 Qt SDK(包含 Qt Creator 和 Qt 库)。
- 创建项目:在 Qt Creator 中创建非 GUI 应用程序(选择
Qt Console Application
)。 - 项目文件配置(
.pro
):QT += core CONFIG += console SOURCES += main.cpp
3. 入门:基本功能
以下通过示例介绍 QtCore 的基本功能。
3.1 事件循环(QCoreApplication)
事件循环是 QtCore 的核心,用于处理定时器、信号等事件。QCoreApplication
是非 GUI 应用程序的主类。
示例:简单的定时器
以下代码使用 QTimer
实现 1 秒后退出程序:
#include <QCoreApplication>
#include <QTimer>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);QTimer::singleShot(1000, []() {qDebug() << "1秒后退出";QCoreApplication::quit();});return app.exec();
}
解析:
QCoreApplication
创建事件循环。QTimer::singleShot
在 1 秒后触发 Lambda 函数。app.exec()
启动事件循环,等待事件处理。
运行结果:程序运行 1 秒后输出消息并退出。
3.2 信号与槽(QObject)
信号与槽是 QtCore 的核心机制,用于对象间通信。
示例:自定义信号与槽
以下代码定义一个类,发出信号并处理:
#include <QCoreApplication>
#include <QObject>
#include <QDebug>class Emitter : public QObject {Q_OBJECT
public:void trigger() {emit signalTriggered("Hello, Signal!");}signals:void signalTriggered(const QString &message);public slots:void handleSignal(const QString &message) {qDebug() << "Received:" << message;}
};int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);Emitter emitter;QObject::connect(&emitter, &Emitter::signalTriggered, &emitter, &Emitter::handleSignal);emitter.trigger();return app.exec();
}
#include "signal_slot_example.moc"
解析:
Emitter
类定义信号signalTriggered
和槽handleSignal
。QObject::connect
连接信号和槽。- 调用
trigger()
发出信号,槽函数输出消息。
运行结果:输出 Received: Hello, Signal!
。
4. 核心功能详解
以下深入解析 QtCore 的主要功能。
4.1 字符串处理(QString)
QString
是 QtCore 的核心类,支持高效的 Unicode 字符串操作。
示例:字符串操作
#include <QCoreApplication>
#include <QString>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);QString str = "Hello, Qt!";qDebug() << "原始字符串:" << str;qDebug() << "大写:" << str.toUpper();qDebug() << "长度:" << str.length();qDebug() << "替换后:" << str.replace("Qt", "World");return app.exec();
}
解析:
toUpper()
:转换为大写。length()
:返回字符串长度。replace()
:替换子字符串。
运行结果:
原始字符串: Hello, Qt!
大写: HELLO, QT!
长度: 10
替换后: Hello, World!
4.2 容器类(QList, QMap 等)
QtCore 提供高效的容器类,如 QList
(动态数组)、QMap
(键值对)。
示例:使用 QList 和 QMap
#include <QCoreApplication>
#include <QList>
#include <QMap>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 使用 QListQList<int> numbers = {1, 2, 3};numbers.append(4);qDebug() << "QList:" << numbers;// 使用 QMapQMap<QString, int> scores;scores["Alice"] = 90;scores["Bob"] = 85;qDebug() << "QMap:" << scores;return app.exec();
}
解析:
QList
:支持动态添加元素。QMap
:存储键值对,支持快速查找。
运行结果:
QList: QList(1, 2, 3, 4)
QMap: QMap(("Alice", 90), ("Bob", 85))
4.3 文件操作(QFile, QDir)
QtCore 提供 QFile
和 QDir
处理文件和目录。
示例:读写文件
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 写入文件QFile file("example.txt");if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream out(&file);out << "Hello, QtCore!\n";file.close();}// 读取文件if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QTextStream in(&file);qDebug() << "文件内容:" << in.readAll();file.close();}return app.exec();
}
解析:
QFile::open
:以写或读模式打开文件。QTextStream
:简化文本 I/O 操作。
运行结果:
文件内容: Hello, QtCore!
4.4 时间和定时器(QTimer, QDateTime)
QtCore 提供时间管理和定时器功能。
示例:定时任务和时间格式化
#include <QCoreApplication>
#include <QTimer>
#include <QDateTime>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 当前时间QDateTime now = QDateTime::currentDateTime();qDebug() << "当前时间:" << now.toString("yyyy-MM-dd hh:mm:ss");// 定时器每秒打印QTimer timer;QObject::connect(&timer, &QTimer::timeout, []() {qDebug() << "定时器触发:" << QDateTime::currentDateTime().toString();});timer.start(1000); // 每秒触发return app.exec();
}
解析:
QDateTime
:获取和格式化当前时间。QTimer
:周期性触发任务。
运行结果:
当前时间: 2025-04-17 12:00:00
定时器触发: 2025-04-17 12:00:01
定时器触发: 2025-04-17 12:00:02
...
5. 进阶:高级功能
以下介绍 QtCore 的高级功能,适合复杂场景。
5.1 多线程(QThread)
QtCore 的 QThread
支持多线程编程,避免主线程阻塞。
示例:异步任务
#include <QCoreApplication>
#include <QThread>
#include <QDebug>class Worker : public QObject {Q_OBJECT
public slots:void doWork() {for (int i = 0; i < 5; ++i) {QThread::sleep(1);qDebug() << "任务进行中:" << i;}emit finished();}signals:void finished();
};int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);QThread thread;Worker worker;worker.moveToThread(&thread);QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);QObject::connect(&worker, &Worker::finished, &thread, &QThread::quit);QObject::connect(&worker, &Worker::finished, &app, &QCoreApplication::quit);thread.start();return app.exec();
}
#include "thread_example.moc"
解析:
Worker
对象移动到新线程。- 信号与槽控制线程启动和结束。
- 主线程保持响应,任务异步执行。
运行结果:
任务进行中: 0
任务进行中: 1
任务进行中: 2
任务进行中: 3
任务进行中: 4
5.2 属性系统(Q_PROPERTY)
Q_PROPERTY
定义动态属性,支持信号通知和反射。
示例:动态属性
#include <QCoreApplication>
#include <QObject>
#include <QDebug>class Person : public QObject {Q_OBJECTQ_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)public:QString name() const { return m_name; }void setName(const QString &name) {if (m_name != name) {m_name = name;emit nameChanged(name);}}signals:void nameChanged(const QString &name);private:QString m_name;
};int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);Person person;QObject::connect(&person, &Person::nameChanged, [](const QString &name) {qDebug() << "姓名更新为:" << name;});person.setName("Alice");person.setName("Bob");return app.exec();
}
#include "property_example.moc"
解析:
Q_PROPERTY
定义name
属性,关联读写方法和信号。- 属性变化触发信号,执行槽函数。
运行结果:
姓名更新为: Alice
姓名更新为: Bob
5.3 JSON 处理(QJsonDocument)
QtCore 提供 QJsonDocument
处理 JSON 数据。
示例:解析 JSON
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);QString jsonStr = R"({"name": "Alice", "age": 25})";QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8());if (doc.isObject()) {QJsonObject obj = doc.object();qDebug() << "姓名:" << obj["name"].toString();qDebug() << "年龄:" << obj["age"].toInt();}return app.exec();
}
解析:
QJsonDocument::fromJson
解析 JSON 字符串。QJsonObject
访问键值对。
运行结果:
姓名: Alice
年龄: 25
6. 性能优化
QtCore 提供高效的实现,但仍需注意性能:
- 减少信号触发:合并多次信号为单次。
- 容器优化:选择合适的容器(如
QList
比QVector
更适合动态调整)。 - 线程安全:使用
QMutex
或QReadWriteLock
保护共享资源。 - 内存管理:利用 QObject 的父子关系自动清理。
示例:优化信号触发
#include <QCoreApplication>
#include <QList>
#include <QDebug>class DataEmitter : public QObject {Q_OBJECT
public:void emitBulkData() {QList<int> data;for (int i = 0; i < 100; ++i) {data.append(i);}emit dataChanged(data); // 单次信号}signals:void dataChanged(const QList<int> &data);public slots:void handleData(const QList<int> &data) {qDebug() << "收到数据:" << data.size() << "项";}
};int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);DataEmitter emitter;QObject::connect(&emitter, &DataEmitter::dataChanged, &emitter, &DataEmitter::handleData);emitter.emitBulkData();return app.exec();
}
#include "optimized_signal_example.moc"
解析:
- 合并 100 次信号为单次,减少开销。
运行结果:
收到数据: 100 项
7. 调试与测试
- 调试输出:使用
qDebug()
、qWarning()
。 - 断言:使用
Q_ASSERT
检查条件。 - 单元测试:结合
QTest
框架测试功能。
示例:单元测试
#include <QTest>
#include <QString>class TestQString : public QObject {Q_OBJECT
private slots:void testToUpper() {QString str = "hello";QCOMPARE(str.toUpper(), QString("HELLO"));}
};QTEST_MAIN(TestQString)
#include "test_example.moc"
解析:
QTest
测试QString::toUpper
。QCOMPARE
验证结果。
运行结果:测试通过或显示失败信息。
8. 从入门到精通的学习路径
- 入门:
- 掌握事件循环和信号与槽。
- 使用
QString
和容器类。 - 实现简单文件操作和定时任务。
- 进阶:
- 使用
QThread
开发多线程程序。 - 掌握
Q_PROPERTY
和 JSON 处理。 - 优化信号与槽性能。
- 使用
- 精通:
- 开发复杂非 GUI 应用(如服务器)。
- 使用
QTest
编写单元测试。 - 集成 QtCore 与其他模块(如 QtNetwork)。
9. 总结
QtCore 是 Qt 框架的基石,提供了事件循环、信号与槽、线程、字符串、文件操作等核心功能。
相关文章:
Qt 核心库总结
Qt 核心库(QtCore) QtCore 是 Qt 框架的基础模块,提供非图形界面的核心功能,是所有 Qt 应用程序的基石。它包含事件循环、信号与槽、线程管理、文件操作、字符串处理等功能,适用于 GUI 和非 GUI 应用程序。本文将从入…...
四大wordpress模板站
WP汉主题 WP汉主题是一个专注于提供高质量WordPress中文主题的平台。它为中文用户提供了丰富的WordPress主题选择,包括但不限于企业网站模板、外贸建站模板等。WP汉主题致力于帮助用户轻松搭建专业的中文网站,无论是企业官网还是个人博客,都…...
Linux之 grep、find、ls、wc 命令
Linux之 grep、find、ls、wc 命令 “ 在 Linux 世界中,命令行是不可或缺的一部分,而掌握一些常用的命令可以帮助你更有效率地管理文件和系统。本文将为你介绍四個基礎而强大的 Linux 命令:grep、find、ls 和 wc,带你开启高效文件…...
SFC的含义
SFC 即 Single File Component,也就是单文件组件,在现代前端开发尤其是 Vue.js 框架中被广泛应用。下面将从概念、结构、优势、工作原理和应用场景几个方面详细介绍 SFC。 概念 单文件组件是一种将一个组件的模板(HTML)、逻辑&a…...
Qt 性能优化总结
Qt 性能优化总结 本文简单解析 Qt 应用程序的性能优化策略,涵盖 GUI 渲染、内存管理、信号与槽、QML 性能等核心领域,并通过具体示例展示优化效果。 1. Qt 性能优化简介 性能优化目标是减少资源消耗(如 CPU、内存、GPU)、提高响…...
亚马逊关键字搜索数据通过 Product Advertising API 来获取
亚马逊关键字搜索数据主要通过 Product Advertising API 来获取。 以下是使用该接口进行关键字搜索的一般步骤: (测试示例) 注册开发者账号:访问亚马逊开发者中心,完成三方供应商注册并同意相关开发者协议࿰…...
现代C++的范式演进与工程实践深度解析(本文序号不知道怎么整的,有点问题)
引言:C++的复兴时代 在经历了"已死语言"的质疑后,现代C++正迎来前所未有的复兴。据2024年TIOBE指数显示,C++以8.33%的占比稳居第三,较2020年上升2.1个百分点。这种复兴并非偶然——随着C++20标准的全面落地和C++23特性的逐步实现,这门已有40年历史的语言正在系…...
第二十五天 - Web安全防护 - WAF原理与实现 - 练习:请求过滤中间件
一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...
springboot自定义starter(避坑教学)
在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在springboot的项目中,一般会将这些公共组件封装为springboot的starter。 1.命名规范 Spring官方Starter通常命名为 spring-boot-starter-{name} 如:spr…...
Python 实现日志备份守护进程
实训背景 假设你是一名运维工程师,需要为公司的监控系统开发一个简单的日志备份守护进程。该进程需满足以下需求: 后台运行:脱离终端,长期监控指定目录(如 /var/log/app/)中的日志文件。自动备份…...
详解JVM的底层原理
目录 1.JVM的内存区域划分 1)程序计数器(Program Counter Register) 2)元数据区(Metaspace) 3)虚拟机栈(Java Virtual Machine Stacks) 4)堆(…...
制表符是什么?与.txt文件的关系?
李升伟 整理 制表符(Tab)是一种控制字符(ASCII码为9,Unicode为\u0009),用于在文本中创建水平间距。它的作用类似于键盘上的 Tab 键,通常表现为光标跳转到下一个预设的“制表位”(一…...
【专题刷题】双指针(三):两数之和,三数之和,四数之和
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
Java八种常见的设计模式
一、单例模式 单例模式是(Singleton Pattern)Java中最常用的设计模式之一,它保证一个类仅有一个实例,并提供一个全局访问点。 实现单例模式的核心是将类的构造方法私有化,以防止外部直接通过构造函数创建实例。同时&am…...
用Prompt 技术【提示词】打造自己的大语言智能体
机器如何按照人类的指令执行任务的探索 机器需具备理解任务叙述的能力,以便能够按照人类的指令执行任务,为机器提供一些范例作为参考,使其能够理解该执行的任务类型。这样的学习方式称为“Instruction learning”,透过精心设计的…...
灵鉴 AI五大核心能力洞穿 “数据黑箱”云取证深度支持8大核心应用
本文关键词:灵鉴AI 、电子数据取证分析AI助手、云取证、DeepSeek大模型 1.灵鉴AI ,V1.0深度融合DeepSeek大模型技术,破解行业痛点,5大核心能力,让大模型真正“懂”电子数据分析。 2.LX-A216云取证系统,V2.…...
了解高速设计的信号完整性仿真
高速设计需要精确的信号传输,以确保最佳性能。信号完整性差会导致关键应用中的误码、数据损坏甚至系统故障等问题。介电常数、损耗角正切和插入损耗等因素会显著影响信号质量。通过使用信号完整性仿真,您可以及早发现并解决这些挑战。这种主动方法有助于…...
用 Deepseek 写的html油耗计算器
在油价高企的今天,了解自己爱车的真实油耗情况对每位车主来说都至关重要。本文将介绍一个简单实用的油耗计算方法,并提供一个可以直接使用的HTML油耗计算器。 为什么要计算油耗? 计算油耗不仅能帮助我们: 了解车辆的真实燃油经济…...
SAP系统青果糖无法报工
问题:班长说工单号4100000101青果糖工单 无法报工 原因排查:工单4100000101的工艺路线版本错误,选了版本1的,版本1是委外的工艺,本厂生产应该选版本2. 解决: 1:重读主数据,更改工单4100000101的工艺路线版本. 2:工单成品已交库,不能直接更改工…...
GPU 招投标全流程分析与总结
GPU 招投标全流程分析与总结 招投标流程概述 以下是通过代理商采购Nvidia H20-GPU 141G的招投标全流程分析: #mermaid-svg-hMPPfkCpGj8GKXfV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hMPPfkCpGj8GKXfV .er…...
Centos7.6安装JDK 1.8教程
前提:先把jdk1.8文件上传到usr/local目录下,文件名如:jdk-8u151-linux-x64.tar.gz 1. 解压 JDK 压缩包 假设 jdk-8u151-linux-x64.tar.gz 文件位于 /usr/local 目录下。 进入 /usr/local 目录: cd /usr/local 解压文件&#…...
Golang errors 包快速上手
文章目录 1.变量2.类型3.函数3.1 New3.2 Is简介函数签名核心功能示例代码使用场景注意事项小结 3.3 As简介函数签名核心功能示例代码使用场景注意事项小结 3.4 Unwrap简介函数签名核心功能使用示例使用场景注意事项小结 3.5 Join简介函数签名核心功能使用场景注意事项小结 4.小…...
新型多机器人协作运输系统,轻松应对复杂路面
受到鱼类、鸟类和蚂蚁等微小生物体协作操纵的启发,研究人员开发了多机器人协作运输系统(Multirobot Cooperative Transportation Systems,MRCTS)运输单个机器人无法处理的重型超大物体,可用于搜救行动、灾难响应、军事…...
易境通国际货代系统:如何解决货代物流行业的棘手难题
国际货代行业作为全球贸易的重要纽带,面临着日益复杂的市场环境和客户需求。然而,随着业务规模的扩张和多变的市场需求,传统的粗放式管理模式逐渐暴露出效率低下、成本失控、风险难控等问题。尤其在跨境电商高速发展的背景下,货代…...
基于springboot医药连锁店管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统医药连锁店管理采取了人工的管理方法&…...
Vue 3 reactive 和 ref 区别及 失去响应性问题
在 Vue 3 中,reactive 和 ref 是实现响应式数据的两个核心 API,它们的设计目标和使用场景有所不同。以下是两者的详细对比: 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理(对象、数组、Map 等)…...
d3.js绘制单/多面板组合箱线图
用d3.js研发了个可以单面板、多面板展示的组合箱线图; 组合箱线图中包括普通散点、蜂群散点、小提琴图、小提琴箱线图、柱状图、误差棒、离群点等等,其中大部分你能想到的配置都是自行传参调整的,你想不到的也能稍作修改然后自行调整&#x…...
第二十四天 - 分布式任务队列 - Celery高级应用 - 练习:分布式监控任务系统
一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...
IDEA使用jclasslib Bytecode Viewer查看jvm字节码
学习jvm的时候,想查看字节码和局部变量表,可以使用idea安装jclasslib Bytecode View插件查看。 (1)安装工具: 安装完成后需要重启idea. (2)准备一段代码,编译运行 package com.te…...
list.
列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储个元素 在 Redis 中,可以对列表两端插入(push)和弹出(pop),…...
202520读书笔记|《我要按自己喜欢的方式去生活》——面对可能到来的裁员,那就等正式通知吧
《我要按自己喜欢的方式去生活》作者宝夏夏,很赞的一本书,通透真实,不矫揉造作,直击内心。 因为第一个故事,裁员而进来的。早晨睡眼惺忪醒来,闺蜜半夜发来一大段话,大意是公司在缩减成本裁员&am…...
Linux 文件传输:系统数据交互的动脉
前言:sshd 在Linux系统中,文件传输常依赖于SSH协议(Secure Shell),而sshd(OpenSSH Daemon)是负责处理SSH连接的后台服务程序。通过sshd,用户可以在加密的通道中进行安全的远程登录、…...
Rust + WebAssembly 生产部署指南
1 最小可行部署(MVP) 前端打包wasm-pack build --target web --release # 生成 .wasm JS 包装器 npm run build / vite build / webpack … # 打包 HTML/CSS/JS 资源拷贝产物 到生产服务器的站点目录dist/ ├── index.html ├── pkg…...
git忽略已跟踪的文件/指定文件
在项目开发中,有时候我们并不需要git跟踪所有文件,而是需要忽略掉某些指定的文件或文件夹,怎么操作呢?我们分两种情况讨论: 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…...
基于Django实现的图书分析大屏系统项目
图书分析大屏展示系统项目大纲与启动教程 一、项目概述 图书分析大屏展示系统是一个基于Django框架开发的Web应用,主要用于图书数据的可视化分析与展示。该系统采用MVT(Model-View-Template)架构模式,结合MySQL数据库࿰…...
【OSCP-vulnhub】GoldenEye
目录 端口扫描 查找源代码 目录扫描 POP3邮件枚举 1.先枚举用户名 2.hydra爆破 3.nc连接 boris: natalya: 设置本地hosts文件 doak: 解析图片 exiftool for-007.jpg strings for-007.jpg 使用MSF去搜索内核版本 漏洞利用 ---…...
OpenAI发布GPT-4.1系列模型,主打编程能力提升
OpenAI在本周一推出了全新一代模型家族——GPT-4.1系列。没错,就是“4.1”,尽管OpenAI的命名方式已经让人有些摸不着头脑。 这一系列包括三个型号:GPT-4.1、GPT-4.1 mini和GPT-4.1 nano。据OpenAI介绍,这些模型在编程任务和指令遵…...
压缩包网页预览(zip-html-preview)
zip-html-preview 项目介绍 这是一个基于 Spring Boot 开发的在线 ZIP 文件预览工具,主要用于预览 ZIP 压缩包中的 HTML 文件及其相关资源。 主要功能 支持拖拽上传或点击选择多个 ZIP 文件自动解压并提取 ZIP 文件中的 HTML 文件在线预览 HTML 文件及其相关的 CSS、JavaSc…...
OpenCV 图形API(41)颜色空间转换----- BGR 图像转换为灰度图像函数BGR2Gray()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从BGR色彩空间转换为灰度。 B、G和R通道值的传统范围是0到255。结果的灰度颜色值计算为: dst ( I ) 0.114 ∗ src ( I ) . B…...
影视产业链中的律师角色以及合规风控要点
影视产业链中的律师角色以及合规风控要点 在影视娱乐业务中,律师服务贯穿项目全生命周期,涵盖创意开发、投z制作、发行传播、艺人管理及争议等多个领域 一、影视项目全流程合同法律事务 ✔️项目开发阶段 剧本合作:剧本委托创作、改编、版权…...
Java工具类——实体类列表写入excel
Java工具类——实体类列表写入excel /*** 将实体类 List 数据写入 Excel 文件* param dataList 实体类对象列表* param filePath Excel 文件路径* param sheetName Sheet 名称* param <T> 泛型类型* throws IOException 文件操作异常* throws IllegalAccessException 反…...
C++23 新预处理器指令详解:#elifdef、#elifndef 和 #warning
文章目录 1. #elifdef 和 #elifndef:更灵活的条件编译1.1 背景与动机1.2 语法与示例示例代码: 1.3 编译器支持 2. #warning:发出编译警告2.1 背景与动机2.2 语法与示例示例代码: 2.3 编译器支持 3. 总结 C23 标准引入了多项改进&a…...
书写API文档的最佳实践[特殊字符]
API文档对于API的可用性和成功至关重要。完善的API文档能显著提高开发者体验,加速采用,并培养强大的开发者社区。反之,糟糕的文档可能导致困惑、挫败感和错误,从而降低采用率。本文将探讨编写清晰、全面、开发者友好的API文档的高…...
【Maven】手动安装依赖到本地仓库
【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖,中央仓库地址:https://mvnrepository.com/ 搜搜你的依赖的a…...
kali下maven 的安装与配置
1、下载 maven 安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 2、解压 apache-maven-3.9.4-bin.tar.gz tar -zxvf apache-maven-3.9.4-bin.tar.gz 找到文件解压到的位置,由于解压时我们没有指定路径&#x…...
list的模拟实现和反向迭代器的底层
1:list的模拟实现 1:链表的节点 对于list的模拟实现,我们需要先定义一个节点的类可以使用(class也可以使用struct) // List的节点类 template<class T> struct ListNode {ListNode(const T& val T()){_p…...
OpenHarmony - 小型系统内核(LiteOS-A)(七)
OpenHarmony - 小型系统内核(LiteOS-A)(七) 八、文件系统 适配新的文件系统 基本概念 所谓对接VFS层,其实就是指实现VFS层定义的若干接口函数,可根据文件系统的特点和需要适配其中部分接口。一般情况下&…...
四层板的时钟线设计:关键要点与实用策略
在电子电路设计领域,四层板凭借其出色的电气性能和合理的空间布局,广泛应用于各类电子产品中。而时钟线作为系统的 “心跳”,为整个电路提供同步信号,其设计质量直接关系到系统的稳定性、可靠性和性能表现。因此,深入探…...
【TypeScript类型系统解析:一次真实的类型检查修复经历】
TypeScript类型系统解析:一次真实的类型检查修复经历 在最近的管理系统开发过程中,我遇到了一个值得深入探讨的TypeScript类型问题。通过解决这个问题,我更深入地理解了TypeScript的类型系统工作原理,以及如何在Vue项目中正确处理…...
全视通无感护理巡视系统方案及产品,助力医院护士巡视病房到位
传统的护理工作中,护理巡视是一项重要且繁琐的任务。护士们需要根据不同的护理级别,定时对患者进行巡视,并手工填写巡视记录表,登记巡视时间、人员等信息。月末时,还需进行人工数据统计,这一过程不仅效率低…...