Qt6 做 HTML5 网页前端?三种落地路线与踩坑实录
如果你和我一样写了好几年 Qt 桌面程序第一次听到“Qt6居然也可以做HTML5网页前端了”这句话第一反应很可能是这俩东西怎么扯到一起的一个靠 C 吃饭的桌面应用框架跑去和 HTML、JavaScript 抢饭碗听着就有种跨界混搭的魔幻感。但我最近实际搭了一圈环境、跑通了几个 Demo 之后不得不承认这个标题确实不是标题党Qt 6 在 Web 前端这个方向上已经有几条能真正落地的路子了。这篇文章我不想做成官方文档的翻译而是从我自己的视角把 Qt6 和 HTML5 网页前端这事的来龙去脉、能跑的方案、以及我踩过的坑从头捋一遍。无论你是想把手头的 Qt 程序搬到浏览器里还是想在桌面壳里嵌入网页界面都可以先看看这篇再动手。1. 打破刻板印象Qt6 与网页前端的三种交汇方式很多人一听“Qt 做网页前端”下意识会以为是把 Qt 的界面用某种工具转成 HTML 代码输出。如果你也这么想那方向就偏了。Qt6 语境下的“做前端”至少有三条完全不同的路线它们在架构、应用场景和实现难度上天差地别。1.1 第一条路Qt 直接编译成网页应用这是“Qt 做前端”最让人兴奋的一条路你的界面仍然用 C 加 QML 写但构建产物不是 .exe 或 .dmg而是一套可以在浏览器里跑起来的 HTML、JavaScript、WebAssembly 文件。核心功臣是 WebAssembly 技术配合官方提供的 Qt for WebAssembly 工具链Qt 的大部分 Widgets 和 Qt Quick 代码可以被交叉编译最终以字节码的形式在浏览器沙箱里运行。这条路线最大的价值在于“资产复用”公司里沉淀了好几年的 C 业务逻辑、算法库、硬件通信模块不需要用 JS 重写一遍直接在网页里继续跑。我认识的一个老哥把内部用的一个数据处理工具用这个方案搬到了网页端核心算法一行没改界面层换成了 QML前后只花了不到两周。不过它也有明显的物理边界浏览器里拿不到本机文件系统、没有完整的窗口管理、输入法兼容性也时不时出幺蛾子。后面我会专门讲这部分。1.2 第二条路桌面壳里跑 HTML5 界面这条路和第一条正好反过来。你的主程序仍然是本地 Qt 应用但界面层换成一套真实的 HTML5 页面通过 Qt 的 QWebEngine 组件把 Chromium 嵌入到窗口里。这样就形成了“壳是 Qt、血肉是 HTML”的混合架构。这种模式这几年在传统软件行业里越来越常见尤其是一些控件复杂、迭代频繁的配置界面。我见过不少工控软件、企业管理系统主框架用 C 保证性能和底层能力而设置页、仪表盘这类更新频繁的模块全部改用 Web 技术开发因为改 HTML 比重新发版方便太多了。Qt 在 WebEngine 之外还提供了 QWebChannel 桥接库让网页里的 JavaScript 可以直接调用 C 对象C 也能反向推送消息给网页相当于给桌面端和 Web 端之间拉了一条数据高速公路。1.3 第三条路QML 本身就是一种“前端描述语言”严格说这条不算“Qt 做 HTML5 前端”但它经常被新人混淆。QML 的语法和 JSON 有点像它用声明式的方式描述界面结构、控制布局、绑定状态思维模式上和 HTML 加 CSS 高度相似。会写前端的同学上手 QML 的速度往往比纯 C 背景的人快很多。Qt 官方的 QML 场景图最终会通过 OpenGL、Vulkan 或软件渲染绘制到原生窗口或 WebAssembly 的 Canvas 上。注意在 Qt for WebAssembly 模式下QML 并不是被转成 DOM 元素而是直接在一个 HTML5 Canvas 里整体绘制。这就意味着你在调试工具里看不到 QML 控件对应的 HTML 节点也基本上没法用 CSS 去改某个 QML 控件的外貌。这三条路线里我最推荐刚接触的人先把第二条和第一条想清楚因为它们决定了你的技术选型方向。下面先展开最硬核的第一条把 C 程序真正编译进浏览器。2. 把 C 程序搬进浏览器环境配置里最容易被卡住的三个环节如果你已经决定尝试 Qt for WebAssembly请务必做好心理准备环境搭建这一步就能劝退一半人。它不是装个 Qt 就能点按钮编译那么简单中间有几个隐性门槛我在第一次搭环境的时候卡了整整一个晚上。2.1 组件安装与编译器版本要严格配对先安装 Qt 6.5 或更高版本在安装器的组件列表里找到 WebAssembly 分类并勾选对应平台的组件。这里埋着第一个坑安装器给你的 WebAssembly 组件默认会捆绑一个特定版本的 Emscripten 工具链。不同 Qt 版本对应的 Emscripten 版本不同如果你自作聪明用系统里旧的 Emscripten 去编译会冒出各种莫名其妙的链接错误比如 undefined symbol、ABI 不匹配。我的建议是完全使用 Qt 工具目录里 wasm_sdk 下的那套工具链不要单独去配环境变量。以我本机为例Qt 6.5 安装后工具链文件位于结算目录的 wasm_sdk 目录下CMake 配置时只需要指定这一个文件cmake -DCMAKE_TOOLCHAIN_FILE$QTDIR/wasm_sdk/qt.toolchain.cmake \ -DCMAKE_BUILD_TYPERelease \ -G Ninja \ .. cmake --build .这里有个细节容易被忽略编译器必须用 clang 而不是 gccWindows 上如果没安装对应版本的 clangEmscripten SDK 一般会自带一份不需要系统已存在的 clang。如果链接阶段报 C 标准库找不到多半是环境变量里残留的 GCC 路径污染了工具链。2.2 一个能跑的最小 CMake 工程环境配好后先别急着搬大项目从最小工程开始跑通。整个工程的核心是 CMakeLists.txt里面最关键的改动来自两步找到 Qt 模块以及目标属性里标记出这是 WebAssembly 程序。cmake_minimum_required(VERSION 3.21) project(web_demo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 6.5 REQUIRED COMPONENTS Quick) qt_add_executable(web_demo main.cpp ) target_link_libraries(web_demo Qt6::Quick)main.cpp 里就是很标准的 Qt Quick 启动代码加载一个 QML 文件#include QGuiApplication #include QQmlApplicationEngine int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral(qrc:/Main.qml))); return app.exec(); }构建完成后构建目录里会生成 web_demo.html、web_demo.js、web_demo.wasm 和可能存在的 web_demo.data 文件。这几个文件要放在同一个目录下用本地 HTTP 服务访问直接双击 html 文件打开多半是白屏。原因是 Emscripten 生成的产物在 file:// 协议下有跨域限制必须通过 http:// 或 https:// 访问。2.3 部署到服务器时的三个 MIME 类型这一步是很多人上线后才会遇到的坑。如果你把生成的文件丢到 Nginx 或 CDN 上页面直接打不开控制台报错显示 wasm 文件加载失败、不是合法的 JavaScript MIME 类型那是因为服务器没有正确识别这几种新文件格式。需要手动配置文件后缀正确的 MIME 类型.wasmapplication/wasm.dataapplication/octet-stream.jstext/javascript正常情况下 .js 不用动但 .wasm 和 .data 必须确认。Nginx 里加上这行即可types { application/wasm wasm; }这里我还遇到过另一个让人抓狂的细节如果你用了 Brotli 预压缩服务器返回的 Content-Encoding 是 br那么原文件的 MIME 类型仍然要按上表设置不能改写成 application/brotli否则浏览器解压完拿到的文件还是无法解析。我一度以为是自己 Qt 组件没装全排查了半天才发现是 MIME 配错了。3. 双向通信拆开看前端按钮如何触发 CC 又如何回传数据环境通了以后真正的核心问题来了网页端和 C 端之间到底是怎么互相调用的如果你之前只写过纯 QML 界面可能对 Q_INVOKABLE 和信号槽已经很熟但在 Wasm 环境下这套机制同样管用只是最终的承载者从本机变成了浏览器。3.1 C 侧暴露函数给前端QML/JS的两种方式最常规的办法是定义一个继承自 QObject 的服务类把希望暴露给界面的函数用 Q_INVOKABLE 标记或者干脆把函数声明成 public slots。这样 QML 侧就能像调用普通 JS 函数一样去调它。class DataService : public QObject { Q_OBJECT public: Q_INVOKABLE int calcTurnover(int stock, int sold) { if (stock 0) return 0; return sold * 100 / stock; } };然后在 main.cpp 里把这个对象注册到 QML 上下文DataService service; engine.rootContext()-setContextProperty(dataService, service);QML 侧直接这样触发Button { text: 计算周转率 onClicked: { var rate dataService.calcTurnover(stockCount, soldCount); resultText.text 周转率 rate %; } }在这个模型里前端按钮触发 C 函数和普通 Qt Quick 桌面应用没有任何区别。你都不用关心数据经过了哪些序列化框架把 QVariant、int、QString 这些基本类型自动映射成了 JavaScript 对应类型。3.2 C 主动向前端回传数据的正确姿势反向通信靠的是信号。C 侧在合适时机发射一个带参数的信号QML 侧用 Connections 或直接绑定接收。class DataService : public QObject { Q_OBJECT signals: void dataReady(const QVariant payload); public: Q_INVOKABLE void refreshData(const QVariantMap config) { // 模拟后台处理后返回结果 QVariantMap result; result.insert(trend, QVariantList{120, 135, 142, 158, 177}); emit dataReady(result); } };QML 侧接收Connections { target: dataService function onDataReady(payload) { console.log(拿到趋势数据, payload.trend); chartModel.reset(payload.trend); } }这就是最正规的“C 强、JS 弱”协作模型C 负责重活干完以后通过信号把结果丢给界面层去渲染。数据量不大的情况下这套通信在浏览器里跑起来非常顺滑体感上和桌面版几乎没差别。3.3 复杂类型传递的坑数组、对象和 QVariantMap第一次跑通纯数字传递后我直接试了传一个二维数组结果发现 QML 侧解析出来的数据变成了一串奇怪的对象。排查后才知道Qt 在 Wasm 环境下对复杂类型的 JS 互操作存在类型映射差异嵌套的 QVariantList 在穿过桥接层时有可能被重置成 QVariantMap 或字符串。解决方法是避免过深的嵌套结构尽量把二维数组压平成一段结构体数组用 QVariantMap 数组来承载。如果数据结构很复杂更稳妥的做法是直接传 JSON 字符串在 JS 侧用 JSON.parse 解析。这也是我在后面做 WebEngine 混合开发时学到的经验桥接层越简单越可靠别把类型系统当成万能传输管道。4. 另一种更常用的玩法QWebEngine 混合开发架构实录如果说 Qt for WebAssembly 是面向“把整个程序塞进浏览器”的激进派那 QWebEngine 混合开发就是稳健的中间派也是我认为大多数团队真正能落地的方向。我在一个内部系统的改造里用了这套架构效果不错这里记录下关键实现和踩坑点。4.1 为什么很多团队走这条路而不直接上浏览器纯粹用 Qt for WebAssembly 做前端目前最大的问题还是启动体积和生态割裂。一个最小可用的 QML 应用渲染到 Canvas 后可能要 15MB 以上的字节码和数据打开页面时有一两秒的白屏等待。而 QWebEngine 混合方案的壳是本地应用HTML5 界面只是它的一部分首屏加载完全取决于页面本身和普通网站速度一致。另一个关键因素是开发效率。Web 团队可以用自己熟悉的 Vue、React、Angular 写界面不需要学 QML样式调整、布局微调、动效迭代全部走前端那套工具链。C 团队只需要维护好桥接对象双方各干各的配合边界非常清晰。4.2 QWebChannel 桥接从注入脚本到互相调用这套架构里最核心的链路是 QWebChannel。它的工作方式是这样C 侧创建一个 QWebChannel 对象把自己想要暴露的对象注册进去然后把这个 channel 关联到 QWebEnginePageHTML 页面里通过 qwebchannel.js 连接通道来完成调用。C 侧的对象很普通class NativeBridge : public QObject { Q_OBJECT public: Q_INVOKABLE int getOrderCount() { return 386; } };然后在 main 函数里把页面加载出来并连接桥#include QApplication #include QWebEngineView #include QWebChannel int main(int argc, char *argv[]) { QApplication app(argc, argv); NativeBridge bridge; QWebChannel channel; channel.registerObject(native, bridge); QWebEngineView view; view.page()-setWebChannel(channel); view.load(QUrl(QStringLiteral(qrc:/index.html))); view.resize(1280, 800); view.show(); return app.exec(); }HTML 页面里只需要引入官方提供的桥接脚本 qrc:///qtwebchannel/qwebchannel.js然后通过 js 建立连接script srcqrc:///qtwebchannel/qwebchannel.js/script script new QWebChannel(qt.webChannelTransport, function (channel) { const native channel.objects.native; native.getOrderCount(function (count) { document.getElementById(orderCount).innerText count; }); }); /script这里最容易踩的坑是 qwebchannel.js 的引用路径。它不是网络上某个 CDN 文件而是 Qt WebChannel 模块提供的一个 qrc 资源记得在项目里 link 上 Qt6::WebChannel并且在 HTML 里写 qrc:///qtwebchannel/qwebchannel.js。我刚开始直接写了一个相对路径结果前端那边一直报 qt is not defined排查了半小时才意识到这个 js 是该从 Qt 资源系统里加载的。4.3 混合架构里的三个注意点第一HTML 页面里的 JS 调用 C 方法都是异步回调模式你的返回值不会立即出现在 JS 变量里。我见过前端同事习惯性地把 C 方法当同步函数用得到 undefined 后一头雾水。一定要在文档里写清楚所有跨桥调用都得走 callback。第二页面资源如果放在 qrc 里更新 HTML 需要重新编译整个安装包。如果你希望 HTML 可以单独热更新就把页面目录设置成可访问比如从本地固定路径加载或者通过 QWebEngineView 的 setUrl 指向一个本地 HTTP 服务。这样前端改一行字不用发版这在企业系统里是非常大的便利。第三页面里的 localStorage、cookie 等浏览器能力在 QWebEngine 里默认是可用的但关闭窗口时并不会自动清空如果你做的是桌面客户端的敏感系统一定留意清理策略。另外如果页面里用了比较新的 JavaScript API比如后台定时器、原生模块要先查一下当前 Qt 内置的 Chromium 版本是否支持绝大多数现代 API 都没问题但个别涉及到浏览器扩展、WebGL 高级特性的页面还是要实测。5. 体积、启动速度和内存实测数据与针对性优化很多人刚听说 Qt 能做前端时最关心的不是“能不能做”而是“做出来跑不跑得动”。这一节我拿一个真实的库存看板 Demo 来说话给你看看体积、启动速度和运行时内存到底什么水平以及踩了哪些坑。5.1 一个最小页面的真实体积构成我用 Qt 6.5 的 Qt Quick 写了一版带表格、图表、按钮和几个文本框的看板没有用额外的第三方库。编译出 Release 版本后构建目录里的文件分布大致是这样的文件大小app.wasm约 14.2 MBapp.js约 1.1 MBapp.data约 3.8 MB也就是说不开启任何压缩光这三个文件加起来就已经接近 20MB。如果你用 Nginx 开启了 Brotli实际传输可以压到 7MB 左右但要注意服务器配置的 MIME 类型按第 2 节说的设置正确。这个体积放在今天的网络环境下属于“能接受但不算友好”尤其是移动端弱网环境首屏等待时间会拉长。如果你用到的模块更多Qt Charts、Qt WebSockets、Qt Multimedia 这些组件全部都静态链接进来wasm 本体轻松突破 25MB。所以做 Qt for WebAssembly 选型时一定要克制模块依赖尽量只引入用得到的部分。5.2 启动慢不是浏览器问题是初始化开销打开这个看板页面从输入 URL 到界面真正响应用户操作我在本地实测大约需要 2 到 3 秒。其中一方面原因是 wasm 解析和编译另一方面是 Qt 运行时的初始化包括内存分配、QML 引擎启动、插件加载。这个开销是固定的和页面复杂程度关系不大。如果你对首屏有执念可以考虑这么几种优化把 wasm 文件放 CDN 并开启预加载在 HTML 里先渲染一个简单的 loading 动画再异步加载 Qt 应用服务端提前压缩并配置好 cache-control。在局域网环境下这些优化做完后实际体感可以压到 1 秒出头已经接近普通网页的水平。5.3 Wasm 模式下的浏览器限制刷新、多线程和输入法这部分我必须单独拿出来说。Qt for WebAssembly 目前默认跑的是单线程模式如果你用了多线程需要额外配置 COOP 和 COEP 响应头否则浏览器会拒绝启动线程。单线程模式意味着你在页面里不能做耗时超过几秒的同步计算否则界面就像死掉一样用户体验非常糟糕。决定用这个方案前你还要接受几个硬限制文件系统是虚拟的保存文件需要走浏览器的下载流程没有原生多窗口概念弹窗只能靠 HTML 层模拟中文输入法在某些浏览器组合下会出现候选框错位我在 Chrome 下测试稳定但在某些移动端浏览器下彻底无法弹输入法。如果你做的是一个需要大量中文输入的业务系统我的建议是老老实实走 QWebEngine 混合路线别硬上 Wasm。6. 什么时候该用 Qt 做前端我的选型结论聊了这么多最后说说我自己的判断。工具本身没有好坏只有适合不合适。“Qt6可以做HTML5网页前端”这句话成立但并不意味着它是一个普适性的方案选之前一定要把场景想清楚。6.1 适合的场景如果你的团队有大量成熟的 C 资产比如图形算法、科学计算库、设备驱动封装而业务要求必须提供一个 Web 入口那 Qt for WebAssembly 会是一个非常高效的方案。核心逻辑不用重写界面层用 QML 快速搭建整体交付周期比用 C 重写一个后端接口加前端页面要短得多。另一个适合的场景是嵌入式或车载系统里的本地前端。你本来就有 Qt 技术栈设备上又跑着 WebView用 QWebEngine 把 HTML5 界面嵌进去既保留了 Web 的灵活迭代又让 C 继续管到底层硬件两边的优势都能吃到。6.2 不适合的场景如果你的产品是面向大众的营销页面、内容站点或者特别依赖 SEO、可访问性那我建议你慎重考虑。Qt 的 Wasm 应用本质上是整体绘制到 Canvas搜索引擎抓不到页面结构屏幕阅读器也很难解析这是此类技术天生的短板。如果 UI 迭代极其频繁今天改个按钮位置、明天换个配色团队里又全是 Web 前端工程师那用 PWA 或 Electron 可能会比 Qt Wasm 更合适。Qt for WebAssembly 的价值在于“复用 C”而不在于“替代前端框架”。Web 生态的长板Qt 没必要也没打算去追。6.3 个人使用的几个实际感受最后再聊点感性的东西。我实际跑通这套东西之后最大的感受是跨端的边界比以前模糊了很多。以前桌面应用和网页应用是两个物种要么选一边开发要么上 Electron 那类方案付出包体积和内存的代价。现在 Qt 6 给出了第三选择并不算完美但它让 C 开发者多了一条通往浏览器的路。如果你目前正纠结要不要上 Qt for WebAssembly我建议你先搭个小 Demo把一个最关心的算法函数放进去跑一轮看体感和体积。很多时候你担心的点实测下来能接受而你没在意的坑反而会突然冒出来。技术选型这种事只有自己亲手跑过一遍心里的天平才会稳。就我个人目前的经验混合开发的 QWebEngine 方案在真实业务里最容易落地而 Qt for WebAssembly 更适合那些“必须复用 C 老代码”的搬家场景。两者不冲突可以并存。

相关新闻

open-code-review:基于增量审查与自动化规则的代码质量实战

open-code-review:基于增量审查与自动化规则的代码质量实战

去年年底我接手了一个遗留系统的重构,代码量不小,团队里每个人对“审查”的理解又不一样。有人习惯在合并请求里逐行评论,有人喜欢拉下来本地慢慢看,还有人干脆只关注功能跑没跑通。几次 review 下来,讨论没少发生&…

2026/10/19 3:51:24 阅读更多 →
STM32F3标准库开发指南:工程搭建与外设驱动避坑实战

STM32F3标准库开发指南:工程搭建与外设驱动避坑实战

简介:STM32F3标准固件库是针对意法半导体STM32F3系列Cortex-M4内核微控制器推出的官方软件开发包,适合嵌入式开发者、电子工程师及高校学生用于底层驱动开发、外设配置与快速项目原型搭建。该库覆盖GPIO、ADC、DAC、TIM、USART、I2C、SPI等全部常用外设驱…

2026/10/19 3:51:24 阅读更多 →
品牌在 AI 回答中“查无此人”,怎么破?从可引用信源说起

品牌在 AI 回答中“查无此人”,怎么破?从可引用信源说起

品牌在 AI 回答中“查无此人”,怎么破?从可引用信源说起 品牌在 AI 回答中“查无此人”,怎么破?从可引用信源说起> 本文为技术实践笔记,讨论生成式引擎优化(GEO)的内容结构、收录推送与回测方…

2026/10/19 3:51:24 阅读更多 →

最新新闻

智能座舱语音交互核心技术术语解析:从ASR到TTS的完整链路

智能座舱语音交互核心技术术语解析:从ASR到TTS的完整链路

智能座舱的发布会上,“语音交互”这几个字被反复提及,但真正看参数页和产品通稿时,满屏的ASR、NLU、AEC、TTS、唤醒率、误唤醒、全双工、可见即可说,说实话我刚接触那会儿也一头雾水。车载语音交互和手机上的语音助手完全是两码事…

2026/10/19 4:29:45 阅读更多 →
从数据驱动到函数表映射:轻量级GUI组件注册机制设计实践

从数据驱动到函数表映射:轻量级GUI组件注册机制设计实践

写GUI框架最痛苦的日子,不是画界面,而是给界面里的每个控件找回调。我早期做过一个不到两千行的小型界面库,按钮不过十几个、页面三四个,看起来工作量不大,可每加一个页面就要去改那个全局的switch-case分发函数&#…

2026/10/19 4:29:45 阅读更多 →
上下文工程实战:从记忆分层到检索调优的Agent一致性指南

上下文工程实战:从记忆分层到检索调优的Agent一致性指南

我最早意识到上下文工程是独立问题,是在一个内部工具的第五次联调上。功能明明都对齐了,模型却能在一段对话里反复失忆:上午刚确认的筛选规则,下午就问第二遍;用户上一轮给了三条约束,模型下一轮只记得两条…

2026/10/19 4:29:45 阅读更多 →
Halcon焊球检测实战:Blob分析从例程到产线的参数调优与避坑指南

Halcon焊球检测实战:Blob分析从例程到产线的参数调优与避坑指南

1. 从一张焊球照片说起:这个例程到底在解决什么问题球焊,也就是业内常说的Bond Ball焊接,是半导体封装和精密电子组装里绕不开的一道工序。一根细细的金线或铜线,末端被电弧烧熔成一个自由空气球,然后压焊到焊盘上&…

2026/10/19 4:29:45 阅读更多 →
代码评审为何总流于形式?open-code-review用静态分析帮你抓重点

代码评审为何总流于形式?open-code-review用静态分析帮你抓重点

上个月我给一支后端团队做代码评审流程梳理,发现他们平均一次PR的评审时间是3分钟。三分钟能干什么?点开diff,扫一眼变量命名,说句LGTM,然后合入。代码评审本应是质量防线,结果成了“点头仪式”。后来我把一…

2026/10/19 4:29:45 阅读更多 →
Keras实现DCGAN:从零搭建稳定图像生成模型

Keras实现DCGAN:从零搭建稳定图像生成模型

1. 从零理解 DCGAN:为什么它比普通 GAN 更值得上手搞深度学习的人多少都碰过 GAN,但真正自己动手从零搭一个能跑出结果的,比例其实不高。原因也简单——GAN 的训练出了名的难伺候,判别器和生成器稍微不平衡就崩,要么生…

2026/10/19 4:28:45 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →