Qt内嵌Vue混合开发:HTTP服务替代file://加载与健壮通信方案
简介本资源是一套基于Qt实现Web服务器并加载Vue应用的C与HTML混合编程实战源码面向具备Qt基础和前端开发经验的中高级开发者解决桌面端嵌入Web界面、前后端一体化开发等典型企业级场景需求。压缩包共90个文件含28个C头文件h与实现文件cpp支撑Qt网络服务、SQLite数据库交互及Vue静态资源托管4个pri工程配置文件、1个qrc资源文件、1个ui界面文件及多个vcxproj/sln工程文件完整覆盖跨平台编译与部署结构另有js、css、html等前端资源及doxyfile、ini等配置文档总大小391KB。已有3753人学习下载提供可直接运行的Qt WebApp服务框架、BitPos项目示例、Element-UI集成模板、SQLite数据操作封装及清晰分层目录src/controller/httpserver/qtservice等助读者快速掌握C后端驱动Web界面的核心技术路径与工程组织范式。1. Qt 嵌入 Vue 应用不是“把 index.html 拖进 QWebEngineView 就完事”真实混合编程要过三关——资源路径隔离、C/JS 双向通信可靠性、构建产物静态服务化很多刚接触 Qt Web 技术栈的开发者第一反应是Vue 打包出 dist 目录丢进 Qt 的 QWebEngineView 加载本地 file:// 路径再用 QWebChannel 绑个对象好像就“混编成功”了。结果跑两步就翻车CSS 样式炸开、图片 404、console 里满屏Failed to load resource: net::ERR_FILE_NOT_FOUND更糟的是点击按钮调 C 函数时有时通、有时不通重启几次才偶然生效——这不是玄学是 Qt 的 WebEngine 在 file:// 协议下对跨域、MIME 类型、相对路径解析的硬性限制在作祟。这个源码包解决的正是从开发态Vue 热更新到部署态Qt 内置 Web 服务的完整闭环它不依赖外部 Node.js 服务而是用 Qt 自带的 QTcpServer 实现一个轻量、可调试、支持 CORS 和 MIME 自动识别的内嵌 HTTP 服务器把 Vue 构建产物当静态资源托管同时封装了健壮的 JSBridge 层屏蔽 QWebChannel 初始化时机、上下文丢失、信号槽连接失败等黑匣子问题。适合正在做工业 HMI、仪器控制面板、本地 AI 工具前端需要 Qt 做底层硬件交互 Vue 做现代 UI 的一线工程师尤其适合那些被qrc:/资源路径折磨过、被QWebChannel.registerObject失效搞崩溃过的同学。2. 为什么必须用 Qt 内置 HTTP 服务替代 file:// 加载协议差异导致的资源加载失效链与 MIME 陷阱2.1 file:// 协议的三大硬伤跨域封锁、相对路径错乱、MIME 类型缺失当你用view-setUrl(QUrl(file:///path/to/dist/index.html))加载 Vue 打包产物时浏览器引擎Chromium 内核会以file://协议启动页面。这看似简单实则埋下三重隐患跨域封锁所有 fetch/AJAX 请求、WebSocket 连接、甚至部分 CSS import 都会被 Chromium 拦截报net::ERR_FAILED。Vue Router 的 history 模式、Axios 请求后端 API、甚至import()动态导入组件都会失败。相对路径错乱Vue CLI 默认生成的index.html中CSS/JS 资源引用为script src/js/app.xxx.js。在file://下/js/被解析为磁盘根目录如C:\js\而非 dist 目录下的js/子目录导致 404。MIME 类型缺失Chromium 对file://下的.js、.css、.woff2文件不自动设置正确 MIME部分字体、SVG、JSON 配置文件直接被拒绝加载控制台报Refused to apply style from xxx.css because its MIME type () is not a supported stylesheet MIME type。提示这不是 Qt 的 Bug是 Chromium 安全策略。官方文档明确指出“Loading local files via file:// is discouraged for web content that needs to interact with other resources.”2.2 内置 HTTP 服务如何破局QTcpServer QHttpEngine 的最小可行架构本源码采用纯 Qt 原生方案不引入第三方 HTTP 库如 cpp-httplib避免编译依赖和 ABI 兼容问题。核心是QHttpEngine—— 一个轻量级、头文件仅 300 行的 Qt HTTP 服务封装已包含在源码包中非第三方库。它基于QTcpServer和QTcpSocket实现自动识别.html→text/html、.js→application/javascript、.css→text/css、.woff2→font/woff2等 20 常见 MIME支持Access-Control-Allow-Origin: *全局跨域头兼容 Vue DevServer 的 proxy 配置路径映射为http://127.0.0.1:8080/→dist/目录所有/xxx请求均按dist/xxx查找彻底解决相对路径问题支持If-Modified-Since缓存协商降低重复加载开销。关键初始化代码如下// main.cpp #include qhttpengine.h #include QDir int main(int argc, char *argv[]) { QApplication app(argc, argv); // 1. 创建 HTTP 服务实例监听 8080 端口 QHttpEngine::Server server(8080); // 2. 设置静态文件根目录为 dist需确保构建后存在 QString distPath QDir::currentPath() /dist; server.setDocumentRoot(distPath); // 3. 启动服务非阻塞Qt 事件循环驱动 if (!server.listen()) { qCritical() Failed to start HTTP server on port 8080; return -1; } qDebug() HTTP server running at http://127.0.0.1:8080/; // 4. 创建主窗口QWebEngineView 加载 http:// 地址 MainWindow w; w.show(); return app.exec(); }逻辑说明QHttpEngine::Server是一个QObject子类内部使用QTcpServer::newConnection()信号接收连接并为每个QTcpSocket启动独立线程处理 HTTP 请求。setDocumentRoot()并非简单字符串赋值而是将传入路径注册为QDir实例后续所有GET /xxx请求都通过QDir::exists(xxx)和QFile::readAll()安全读取自动处理..路径遍历防护。参数说明8080端口号可任意修改避开已占用端口建议 8000–8999 区间distPath必须为绝对路径推荐用QDir::currentPath() /dist或QApplication::applicationDirPath() /dist避免相对路径歧义listen()返回bool失败时应检查端口占用netstat -ano | findstr :8080或权限Windows 下非管理员无法绑定 1024 以下端口。2.3 Vue 构建配置适配public 目录与 base 路径的双重修正Vue CLI 的vue.config.js必须同步调整否则即使 HTTP 服务跑起来资源仍会 404// vue.config.js module.exports { // 关键1base 设为 /确保所有资源路径以根开头 publicPath: /, // 关键2outputDir 指向 Qt 项目期望的 dist 目录 outputDir: ../qt_project/dist, // 关键3禁用 HTML 注入由 Qt 主程序控制页面加载 configureWebpack: { plugins: [ new HtmlWebpackPlugin({ inject: false, // 不自动注入 JS/CSS由 index.html 显式写入 template: public/index.html }) ] } }逻辑说明publicPath: /是核心。Vue CLI 默认publicPath: /但若你曾改过如设为./或auto打包后index.html中的script srcjs/app.js会变成script src./js/app.jsHTTP 服务无法将其映射到dist/js/app.js。outputDir必须与 Qt 代码中setDocumentRoot()的路径严格一致建议用相对路径../qt_project/dist避免硬编码绝对路径。参数说明publicPath影响所有静态资源 URL 前缀必须为/或空字符串等价于/outputDir必须是 Qt 项目目录下的子路径确保qmake或CMakeLists.txt能在构建后自动复制或链接该目录inject: false防止 HtmlWebpackPlugin 自动插入script标签保持index.html干净由开发者显式控制加载顺序。3. C 与 Vue 双向通信的健壮封装绕过 QWebChannel 初始化竞态与上下文丢失3.1 QWebChannel 的经典失效场景页面未加载完成就注册对象最常被忽略的坑是QWebChannel对象注册必须在QWebEnginePage::loadFinished信号触发后执行且需确保QWebEngineView的page()已完全初始化。常见错误写法// ❌ 错误构造函数里就注册此时 page() 可能为空或未加载 JS MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { view new QWebEngineView(this); channel new QWebChannel(this); channel-registerObject(cppApi, cppApi); // 此时 registerObject 无效 view-page()-setWebChannel(channel); // page() 可能为 nullptr }正确做法是监听loadFinished并在回调中分三步执行// ✅ 正确延迟注册确保上下文就绪 void MainWindow::onLoadFinished(bool ok) { if (!ok) { qWarning() Page load failed; return; } // 1. 获取当前 page确保非 nullptr QWebEnginePage* page view-page(); if (!page) return; // 2. 创建新 channel避免复用旧 channel 导致状态混乱 channel new QWebChannel(this); channel-registerObject(cppApi, cppApi); // 3. 绑定 channel 到 page并注入 JS 初始化脚本 page-setWebChannel(channel); page-runJavaScript(R( // 确保 QWebChannel 已注入 if (typeof QWebChannel ! undefined) { new QWebChannel(qt.webChannelTransport, function(channel) { window.cppApi channel.objects.cppApi; console.log(C API ready); }); } )); }逻辑说明loadFinished信号只在 HTML 文档 DOM 构建完成、JS 引擎就绪后触发。runJavaScript()注入的脚本会立即执行创建QWebChannel实例并挂载cppApi到window全局对象供 Vue 组件直接调用。channel-registerObject()必须在setWebChannel()之后调用否则对象不会被 JS 端发现。参数说明ok参数true表示加载成功false表示网络错误或解析失败需记录日志qt.webChannelTransportQt 内置的通信通道对象无需手动创建channel.objects.cppApiJS 端访问 C 对象的标准路径cppApi名称必须与registerObject()第二个参数一致。3.2 Vue 组件中安全调用 C 方法Promise 封装与错误兜底在 Vue 中直接调用window.cppApi.someMethod()存在风险方法可能未定义channel.objects.cppApi为undefined、调用后无响应C 未 emit 信号、或参数类型不匹配Qt 不自动转换复杂对象。本源码提供CppBridge.js工具类// src/utils/CppBridge.js class CppBridge { constructor() { this.api window.cppApi; this.isReady !!this.api; } // 封装为 Promise超时 5s失败返回 reject call(methodName, ...args) { return new Promise((resolve, reject) { if (!this.isReady) { return reject(new Error(Cpp API not ready: ${methodName})); } const timeout setTimeout(() { reject(new Error(Timeout calling ${methodName})); }, 5000); try { // Qt 会自动将 JS 参数转为 QVariant支持 number/string/boolean/array/object const result this.api[methodName](...args); // 若 C 方法 emit 了 signal此处 result 为 undefined需监听 signal if (result ! undefined) { clearTimeout(timeout); resolve(result); } } catch (e) { clearTimeout(timeout); reject(e); } }); } } export default new CppBridge();在 Vue 组件中使用!-- src/components/ControlPanel.vue -- template button clickhandleStart启动设备/button /template script import CppBridge from /utils/CppBridge; export default { methods: { async handleStart() { try { const status await CppBridge.call(startDevice, COM3, 115200); console.log(Device started:, status); } catch (err) { console.error(Failed to start device:, err.message); this.$message.error(启动失败${err.message}); } } } }; /script逻辑说明call()方法统一处理undefined返回值Qt 信号触发场景、异常捕获、超时控制。await语法让异步调用像同步一样直观避免回调地狱。CppBridge实例在全局单例避免重复创建。参数说明methodNameC 类中Q_INVOKABLE或Q_SLOT标记的方法名大小写敏感...args支持基本类型int,QString,bool、数组QVariantList、简单对象QVariantMap不支持QImage、QByteArray等二进制类型需 Base64 编码timeout5000ms 是经验阈值硬件操作类接口可延长至 10sUI 响应类建议 1s。3.3 C 端主动推送数据到 VueSignal 触发 JS 回调注册模式Qt 侧不能只被动响应调用还需主动推送状态如传感器数据、进度更新。本源码采用“信号 JS 回调注册”模式规避QWebChannel的connectTo一次性绑定缺陷// cppapi.h class CppApi : public QObject { Q_OBJECT public: explicit CppApi(QObject *parent nullptr); signals: void sensorDataUpdated(const QString jsonString); // 推送 JSON 字符串Vue 侧 parse public slots: void registerJsCallback(const QString callbackName); private: QString m_jsCallbackName; }; // cppapi.cpp void CppApi::registerJsCallback(const QString callbackName) { m_jsCallbackName callbackName; // 保存 JS 函数名 } void CppApi::onSensorDataReady(const QByteArray data) { // 模拟传感器数据到达 QString json QString::fromUtf8(data); emit sensorDataUpdated(json); // 同时尝试调用 JS 回调如果已注册 if (!m_jsCallbackName.isEmpty()) { QWebEnginePage* page /* 获取当前 page */; page-runJavaScript(QString(if (typeof %1 function) %1(%2);) .arg(m_jsCallbackName) .arg(json)); } }Vue 侧注册回调// src/main.js import CppBridge from /utils/CppBridge; // 在应用启动时注册全局回调 window.onSensorData (data) { console.log(Received sensor data:, data); // 触发 Vuex mutation 或事件总线 EventBus.emit(sensor:update, data); }; // 告诉 C 端 JS 回调函数名 CppBridge.call(registerJsCallback, onSensorData);逻辑说明registerJsCallback将 JS 函数名存入 C 对象sensorDataUpdated信号发射时既走标准QWebChannel通道供 Vuewatch监听又用runJavaScript主动调用 JS 函数双保险确保数据必达。onSensorData是全局函数避免this上下文丢失。参数说明callbackNameJS 全局函数名必须为字符串字面量不可含.或[]jsonString建议用QJsonDocument::toJson()生成标准 JSON避免 Qt 字符串编码问题runJavaScript调用需确保page有效建议在loadFinished后缓存page指针。4. 避坑Qt Vue 混合开发中 5 个血泪踩坑记录与现场排查指南4.1 现象Vue 页面白屏控制台报ReferenceError: QWebChannel is not defined原因QWebEngineView加载的 HTML 中未引入qrc:/qtwebchannel/qwebchannel.js或引入顺序错误必须在index.html的head中且早于任何使用QWebChannel的 JS。解决在public/index.html的head中显式添加script srcqrc:/qtwebchannel/qwebchannel.js/script注意qrc:/是 Qt 资源系统路径不是文件系统路径若用 HTTP 服务此行可删因QWebChannel已由 Qt 自动注入qt.webChannelTransport。4.2 现象C 调用emit signalVue 侧watch无响应但console.log(window.cppApi)显示对象存在原因Vue 组件mounted钩子中注册watch时QWebChannel尚未完成初始化window.cppApi是空壳对象其属性未被 Proxy 代理。解决改用nextTick延迟注册mounted() { this.$nextTick(() { this.$watch( () window.cppApi?.status, (newVal) console.log(Status changed:, newVal) ); }); }4.3 现象Vue 构建后dist/js/app.xxx.js加载 404HTTP 服务日志显示GET /js/app.xxx.js 404原因vue.config.js中outputDir路径错误或QHttpEngine::Server::setDocumentRoot()设置的路径与实际dist目录不一致也可能是dist目录未生成npm run build未执行。解决运行ls -la qt_project/distLinux/macOS或dir qt_project\distWindows确认目录存在且非空在 Qt 代码中打印QDir(documentRoot).absolutePath()与终端pwd对比是否为同一路径检查dist目录下是否有js/子目录及.js文件Vue CLI 默认生成。4.4 现象QWebChannel.registerObject(cppApi, cppApi)后JS 侧window.cppApi为undefined原因QWebEngineView的page()在setWebChannel()前已被销毁如多次setUrl()或cppApi对象生命周期短于QWebEngineView如局部变量。解决cppApi必须为MainWindow成员变量或QApplication父对象确保其生命周期覆盖整个应用setWebChannel()必须在page()有效后调用且不要重复调用每次setWebChannel()会清空旧 channel在loadFinished中qDebug() Page: page Channel: channel;确认两者非空。4.5 现象Vue 组件中await CppBridge.call(getData)永远 pending无超时、无 reject原因C 方法getData()未加Q_INVOKABLE宏或返回类型为voidQt 不允许void方法返回 Promise或方法内部发生未捕获异常导致 Qt 事件循环卡死。解决检查 C 方法声明Q_INVOKABLE QString getData();必须有返回值在方法内加qDebug()日志确认是否执行到末尾若方法需耗时操作务必用QTimer::singleShot(0, ...)将执行移出主线程避免阻塞 UI使用qInstallMessageHandler捕获 Qt 侧 C 异常日志。5. 构建与部署全流程从 Vue 开发热更新到 Qt 发布版一键打包5.1 开发阶段Vue DevServer 代理 Qt 本地 HTTP 服务双模式切换开发时不应每次改 Vue 就重新npm run build应利用 Vue CLI 的devServer.proxy将 API 请求代理到 Qt 启动的 HTTP 服务// vue.config.js module.exports { devServer: { port: 8081, proxy: { /api: { target: http://127.0.0.1:8080, // 代理到 Qt HTTP 服务 changeOrigin: true, pathRewrite: { ^/api: } } } } }此时流程为启动 Qt 程序内置 HTTP 服务监听8080npm run serve启动 Vue DevServer监听8081浏览器访问http://localhost:8081Vue 页面由 DevServer 提供页面中fetch(/api/start)自动代理到http://127.0.0.1:8080/start由 Qt 的QHttpEngine处理QWebChannel通信照常工作因QWebEngineView加载的是http://127.0.0.1:8080Qt 服务地址非8081。优势Vue 热更新秒级生效C 逻辑无需重启真正实现“改前端不重编 C”。5.2 构建阶段CMakeLists.txt 自动化复制 dist 目录与资源Qt 项目使用 CMake 时在CMakeLists.txt中添加构建后命令确保dist目录随可执行文件一起发布# CMakeLists.txt # ... 其他配置 # 定义 dist 目录路径与 vue.config.js outputDir 一致 set(VUE_DIST_DIR ${CMAKE_SOURCE_DIR}/dist) # 添加自定义目标复制 dist 目录到构建输出目录 add_custom_target(copy_vue_dist ALL COMMAND ${CMAKE_COMMAND} -E make_directory $TARGET_FILE_DIR:MyApp/dist COMMAND ${CMAKE_COMMAND} -E copy_directory ${VUE_DIST_DIR} $TARGET_FILE_DIR:MyApp/dist DEPENDS MyApp ) # 让 MyApp 依赖 copy_vue_dist确保先复制再链接 add_dependencies(MyApp copy_vue_dist)逻辑说明add_custom_target创建一个名为copy_vue_dist的构建目标COMMAND执行mkdir和cp -rWindows 为xcopy。$TARGET_FILE_DIR:MyApp是 CMake 内置生成器表达式自动解析为MyApp可执行文件所在目录如build/bin/避免硬编码路径。add_dependencies确保copy_vue_dist在MyApp链接前执行。参数说明MyApp你的 Qt 可执行目标名需与add_executable(MyApp ...)一致${VUE_DIST_DIR}必须与vue.config.js中outputDir完全相同ALL关键字使该目标默认参与make all无需手动make copy_vue_dist。5.3 发布阶段Windows/Linux/macOS 一键打包清单与路径校验脚本发布版需确保dist目录与可执行文件同级且 HTTP 服务setDocumentRoot()使用相对路径。本源码提供deploy_check.shLinux/macOS和deploy_check.batWindows进行自动化校验#!/bin/bash # deploy_check.sh EXE_PATH./MyApp DIST_PATH./dist echo Deploy Check echo Executable: $(realpath $EXE_PATH) echo Dist dir: $(realpath $DIST_PATH) if [ ! -f $EXE_PATH ]; then echo ERROR: Executable not found! exit 1 fi if [ ! -d $DIST_PATH ]; then echo ERROR: dist directory not found! exit 1 fi if [ ! -f $DIST_PATH/index.html ]; then echo ERROR: index.html missing in dist! exit 1 fi echo ✅ All checks passed. Ready to ship.Windows 版本deploy_check.batecho off set EXE_PATHMyApp.exe set DIST_PATHdist echo Deploy Check echo Executable: %CD%\%EXE_PATH% echo Dist dir: %CD%\%DIST_PATH% if not exist %EXE_PATH% ( echo ERROR: Executable not found! exit /b 1 ) if not exist %DIST_PATH% ( echo ERROR: dist directory not found! exit /b 1 ) if not exist %DIST_PATH%\index.html ( echo ERROR: index.html missing in dist! exit /b 1 ) echo ✅ All checks passed. Ready to ship.逻辑说明脚本检查三要素——可执行文件存在、dist目录存在、index.html存在。这是发布前最后防线避免因dist未复制导致用户启动白屏。建议将脚本加入 CI/CD 流程或作为发布 checklist 的第一步。参数说明realpathLinux/macOS获取绝对路径避免cd切换导致的路径歧义%CD%Windows当前目录等价于realpath .exit /b 1Windows 下exit /b退出批处理不影响父 shell。5.4 进阶技巧Qt 资源系统qrc与 HTTP 服务的混合加载策略某些场景下你希望部分资源如图标、字体走qrc:/零拷贝、防篡改而 Vue 主体走 HTTP支持热更新。本源码支持混合模式在QHttpEngine中拦截特定路径回退到QResource// qhttpengine.cpp 修改片段 void Server::handleRequest(const HttpRequest request, HttpResponse response) { QString path request.path(); // 优先检查 qrc 资源/assets/ 开头的请求走 qrc if (path.startsWith(/assets/)) { QString qrcPath :/ path.mid(8); // /assets/icon.png - :/icon.png if (QFile::exists(qrcPath)) { QFile file(qrcPath); if (file.open(QIODevice::ReadOnly)) { response.setHeader(Content-Type, mimeTypeForFile(qrcPath)); response.write(file.readAll()); file.close(); return; } } } // 其余请求走 dist 目录 QString filePath m_documentRoot path; // ... 原有文件读取逻辑 }Vue 中引用qrc资源template img :srcqrc:/logo.png altLogo /template逻辑说明QHttpEngine是可扩展的通过重写handleRequest可实现路由级资源分发。qrc:/资源编译进二进制无需额外文件HTTP 服务负责动态内容。mimeTypeForFile()是辅助函数根据文件扩展名返回 MIME已内置在源码中。参数说明path.startsWith(/assets/)约定路径前缀可自定义为/static/、/res/等:/ path.mid(8)将 HTTP 路径映射为 qrc 路径mid(8)去掉/assets/8 个字符QFile::exists(qrcPath)Qt 资源系统 API检查资源是否存在。从那以后我每次交付 QtVue 混合项目都会在deploy_check.sh里多加一行ls -la ./dist/js/ | head -5确认构建产物确实生成了哈希命名的 JS 文件——因为曾经有次 CI 脚本漏了npm cidist目录是空的用户反馈“点开就白屏”而我本地npm run serve一切正常花了三小时才定位到是构建环节静默失败。这种低级错误用一行ls就能拦住。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

LTK8315 单通道集成 H‑桥有刷直流电机驱动芯片|LTKCHIP 联辉科

LTK8315 单通道集成 H‑桥有刷直流电机驱动芯片|LTKCHIP 联辉科

一、产品整体概述LTK8315 是单通道全集成 H 桥电机驱动,SOP‑8 封装,内置四颗 N‑MOS 与电荷泵;电机电源 VM2.5‑12V;高低侧合计导通电阻典型 320mΩ;平均输出电流 2.1A,峰值 3.5A;INA、INB 两路…

2026/10/14 1:56:16 阅读更多 →
Dapper

Dapper

不使用Dapper是什么意思 & Dapper是什么 1. Dapper 是什么 Dapper 是.NET生态里最流行的轻量ORM(对象关系映射)库,Stack‑Overflow开发的,NuGet包名 Dapper。ORM:把数据库表 → C#实体类对象自动映射,不…

2026/10/14 1:55:16 阅读更多 →
Flutter瀑布流与GridView深度解析:性能、布局与渲染原理

Flutter瀑布流与GridView深度解析:性能、布局与渲染原理

1. 项目概述:为什么一个看似简单的 GridView 示例值得花一整篇深度拆解?Flutter 里写个网格列表,不就是套个GridView.builder、设个crossAxisCount就完事了?我最初也这么想。直到在某跨平台系统重构中,用默认GridView实…

2026/10/14 1:55:16 阅读更多 →

最新新闻

Vue 3 轻量级数据透视表组件:支持拖拽+聚合+Excel导出

Vue 3 轻量级数据透视表组件:支持拖拽+聚合+Excel导出

简介:这是一份面向Vue.js中高级开发者的数据透视表功能实现组件包,专为需要在Web应用中快速集成交互式聚合分析表格的前端工程师设计。资源提供两个核心Vue组件:支持拖放配置行列的完整数据透视表,以及轻量级仅聚合功能的PivotTab…

2026/10/14 2:45:28 阅读更多 →
CLRS 习题精解:B 树基本操作(B-TREE-INSERT、查找最值与前驱)与复杂度分析

CLRS 习题精解:B 树基本操作(B-TREE-INSERT、查找最值与前驱)与复杂度分析

文档教程教育 【免费下载链接】CLRS 📚 Solutions to Introduction to Algorithms Third Edition 项目地址: https://gitcode.com/gh_mirrors/clr/CLRS 点击查看 免费下载 本文以《算法导论(第三版)》第 18 章 18.2 节"B 树…

2026/10/14 2:45:28 阅读更多 →
加班后的回程路上,更适合先听完《妈妈,我失业了》

加班后的回程路上,更适合先听完《妈妈,我失业了》

傍晚下班路上,中学生,把耳机音量调到刚好盖住走廊声在便利店门口抽一口冷气再进门。歌词里「走不出了」写的就是这种说不清又不甘心的时刻——《妈妈,我失业了》接住的,正是这截情绪。词曲:小熊歌|演唱&…

2026/10/14 2:45:28 阅读更多 →
【Python实战】基于FastAPI的绿植养护管理系统 - 完整项目

【Python实战】基于FastAPI的绿植养护管理系统 - 完整项目

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐➕关注👀是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝关注👀欢迎…

2026/10/14 2:45:28 阅读更多 →
Cap 开源录屏上手:从依赖自检到发出第一条分享链接

Cap 开源录屏上手:从依赖自检到发出第一条分享链接

Cap 开源录屏上手:从依赖自检到发出第一条分享链接 【免费下载链接】Cap Open source Loom alternative. Beautiful, shareable screen recordings. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 给同事讲一个功能,你得先凑齐三人的日…

2026/10/14 2:45:28 阅读更多 →
单片机毕设选题推荐:基于STM32的婴儿摇篮哭泣尿床监测与环境联动控制系统设计 基于物联网的婴儿床温湿度自动调节与哄睡装置设计(032707)

单片机毕设选题推荐:基于STM32的婴儿摇篮哭泣尿床监测与环境联动控制系统设计 基于物联网的婴儿床温湿度自动调节与哄睡装置设计(032707)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/14 2:44:28 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →