1. TraeCN 做 Qt 上位机开发,从零跑通 AI 编程全流程
TraeCN 是字节跳动推出的一款 AI 原生 IDE,核心能力是把自然语言需求直接转成可编译的工程代码,适合工控上位机、桌面端工具这类"功能明确但界面琐碎"的项目。Qt 上位机开发恰好是它的甜区:工程结构固定、信号槽模式成熟、配置项重复度高,AI 补全和生成的成功率比写业务后端要高不少。如果你手上有 Qt Creator 和一套老版本 Qt(比如 4.8),又不想继续在旧工程里缝缝补补,那这套流程可以直接照搬。
我这次的目标很具体:做一个机型配置解析上位机,能读写配置文件、带基础配置和高级配置两组参数、支持下拉框选择、右下角显示 SVN 版本号。技术栈定死 Qt,编译环境用本机已有的 Qt Creator。整个过程从下午两点半到晚上十点半,八小时跑通一个可运行 Demo,中间踩了三个典型坑:ui_mainwindow.h 找不到、QStatusBar 不完整类型、界面中文乱码。这三个坑的解法我都会在下面写清楚,你照着改就能过。
需要先说明一点:TraeCN 负责生成和修改代码,但编译、运行、串口调试这些动作仍然在 Qt Creator 里完成。AI 不是替代编辑器,它是把你的需求翻译成工程文件的那一层。理解这个分工,后面配置才不会乱。
这篇内容面向工控和桌面端开发者,假设你会基本的 Qt 信号槽、知道 .pro 文件是干嘛的,但不需要你精通 qmake。全文按"建工程 → 配 AI 规则 → 编译排障 → 串口验证"的顺序走,每一步都有可复制的配置片段。
2. TaoToken 前置准备:给 TraeCN 接上稳定的模型通道
TraeCN 本身可以调用内置模型,但在实际项目里,尤其是需要长上下文理解整个 Qt 工程结构的时候,模型通道的稳定性直接决定生成质量。我自己的做法是给 TraeCN 配一个独立的 API 通道,这样模型选择、Key 管理、用量查看都在自己手里,换工具也不用重新折腾。
TaoToken 在这里扮演的角色就是"模型接入层":它提供统一的 API 地址和 Key,兼容 OpenAI 风格的请求格式,TraeCN、Cline、Codex 这类工具都能直接对接。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api ,注意这个地址后面不加任何 UTM 参数,配置的时候别画蛇添足。
具体要准备三样东西,我把它叫"三件套":
| 配置项 | 取值来源 | 用途 |
|---|---|---|
| Base URL | https://taotoken.net/api | 告诉 TraeCN 往哪发请求 |
| API Key | 控制台创建 | 身份校验,别泄露 |
| Model ID | 按需选择 | 决定用哪个模型生成代码 |
Key 的创建在控制台完成,路径是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,进去之后新建一个 Key,复制出来保存好。如果你只是想先验证模型能不能通,可以用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 发一条测试消息,确认返回正常再往 IDE 里配。
这里有个容易忽略的点:TraeCN 的模型配置和普通聊天工具不一样,它需要的是"能理解代码上下文"的模型,而不是纯对话模型。选 Model ID 的时候优先选代码能力强的,否则生成 Qt 工程的时候会出现信号槽签名对不上、头文件漏 include 这类低级错误。我实测下来,代码类模型在生成 mainwindow.cpp 这种文件时,一次通过率明显更高。
另外,如果你打算长期用 AI 做编码和 Agent 任务,可以看一下 Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,它针对的就是这种持续编码场景,比单次调用更划算。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各工具的对接示例,配之前扫一眼能省不少试错时间。
3. TraeCN 项目配置与 Qt 工程模板可复制片段
这一节是全文的核心,我把 TraeCN 的配置文件和 Qt 工程的关键片段都写出来,你直接复制改路径就能用。
先说 TraeCN 侧的配置。不同版本的 TraeCN 配置入口略有差异,但本质都是填 Base URL、Key、Model ID 这三项。以 settings 形式为例,配置片段长这样:
{ "ai.provider": "openai-compatible", "ai.baseUrl": "https://taotoken.net/api", "ai.apiKey": "sk-你的Key", "ai.model": "你的ModelID", "ai.contextWindow": 128000, "ai.autoApply": true }ai.autoApply这个参数建议开成 true,意思是 AI 生成的代码改动直接落到文件里,不用你手动点确认。做 Qt 工程的时候文件多,手动确认会打断节奏。但要注意,开了自动应用之后,改之前最好用 git 或者 SVN 存一版,万一 AI 改错了能回滚。
然后是 Qt 工程侧。TraeCN 生成工程的时候,我建议在需求描述里就把编译环境说清楚,比如"使用 Qt 4.8,qmake 构建,Windows 平台,MinGW 编译器"。这样它生成的 .pro 文件才不会用高版本 Qt 的语法。一个典型的 .pro 片段:
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = DC2CNF TEMPLATE = app SOURCES += main.cpp \ mainwindow.cpp \ configmanager.cpp HEADERS += mainwindow.h \ configmanager.h DEFINES += SVN_VERSION=\\\"$$system(svn info -r HEAD | grep Revision)\\\"最后那行 DEFINES 是给版本号用的,把 SVN 的 Revision 编进宏里。如果你不用 SVN,换成 git 的git rev-parse --short HEAD也行。
关于 AI 补全规则,TraeCN 支持在项目根目录放规则文件,告诉 AI 这个项目的编码约定。我放了一个.trae/rules.md,内容大概是:
- 所有界面文本使用 tr() 包裹,编码统一 UTF-8 - 配置项读写统一走 ConfigManager 类,不要在 MainWindow 里直接操作 QSettings - 下拉框选项用 QComboBox,数据源从 config 结构体读取 - 新增配置项时同步更新 basicConfig 和 advancedConfig 两个分组这个规则文件的作用是让 AI 每次生成代码都遵守同一套约定,不然它这次用 QSettings、下次用自定义文件格式,工程会越来越乱。我试过不加规则文件,生成到第三轮的时候配置读写逻辑就开始打架了。
工程目录结构建议这样组织,TraeCN 理解起来更顺:
DC2CNF/ ├── DC2CNF.pro ├── main.cpp ├── mainwindow.h ├── mainwindow.cpp ├── configmanager.h ├── configmanager.cpp ├── .trae/ │ └── rules.md └── config/ └── default.ini把配置管理单独抽成 ConfigManager 类,是这次能顺利推进的关键。AI 生成界面代码的时候容易把逻辑写进 MainWindow,抽出来之后职责清晰,后面加配置项只需要改 ConfigManager 和对应的 UI 绑定。
4. 编译运行与串口通信验证:从报错到跑通
配置好之后就是编译验证。这一步会遇到几个典型报错,我按实际遇到的顺序写。
第一个报错是ui_mainwindow.h: No such file or directory。原因是 TraeCN 生成的工程用了 UI 文件(mainwindow.ui),但 qmake 没有正确触发 uic 编译,或者 .pro 里漏了 FORMS 配置。正常 .pro 应该有:
FORMS += mainwindow.ui如果加了还是报错,说明 uic 没跑起来。这时候有两个选择:一是检查 Qt 版本和 qmake 路径是否匹配,二是干脆放弃 .ui 文件,让 AI 直接用代码创建界面。我当时选的是后者,直接跟 TraeCN 说"不用 ui 文件,用纯代码创建界面",它把 mainwindow.cpp 里的ui->setupUi(this)换成了手动的控件创建和布局代码,编译就过了。纯代码方式的好处是不依赖 uic,坏处是界面调整要改代码,但对上位机这种界面不复杂的项目完全够用。
第二个报错是invalid use of incomplete type 'struct QStatusBar'。这个是因为 mainwindow.cpp 里用了 QStatusBar 但没 include 对应头文件。解决很简单,在 mainwindow.cpp 顶部加:
#include <QStatusBar>TraeCN 收到这个报错信息后,会自动补上 include。这里体现了一个使用技巧:报错信息要原样贴给 AI,包括文件路径和行号,它定位问题比你自己猜快得多。
第三个问题是界面中文乱码。Qt 4.8 默认编码不是 UTF-8,需要在 main.cpp 里设置:
#include <QTextCodec> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); MainWindow w; w.show(); return a.exec(); }这三行 setCodec 是 Qt 4.8 处理中文的标准做法,Qt 5 之后就不需要了。设置完重新编译,界面上的"基本配置""高级配置"就正常显示了。
版本号显示这块,我给了 TraeCN 一段示例代码:
#define SVN_VERSION "$Rev: 7996 $" char cString[32]; memset(cString, 0, sizeof(cString)); sprintf(cString, "%s", SVN_VERSION);它学习之后把版本号渲染到了主界面右下角,用的是 QLabel 加状态栏。编译后在右下角能看到$Rev: 7996 $这样的字符串。然后把源码文件加上 SVN 关键字属性,每次提交版本号会自动更新。
串口通信验证是上位机 Demo 的最后一环。我用 QSerialPort 做测试,核心代码:
#include <QSerialPort> #include <QSerialPortInfo> QSerialPort serial; serial.setPortName("COM3"); serial.setBaudRate(QSerialPort::Baud115200); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); if (serial.open(QIODevice::ReadWrite)) { qDebug() << "串口打开成功"; serial.write("AT\r\n"); connect(&serial, &QSerialPort::readyRead, [&]() { QByteArray data = serial.readAll(); qDebug() << "收到:" << data; }); } else { qDebug() << "打开失败:" << serial.errorString(); }注意 Qt 4.8 本身不带 QSerialPort,需要单独装 qtserialport 模块,或者在 .pro 里加QT += serialport。如果编译报找不到 QSerialPort,先确认模块装了没有。跑通之后,串口能正常收发数据,这个上位机 Demo 就算完整了。
5. 本篇常见错误排查:401、local proxy failed、reading choices、OAuth
这一节把配置和运行过程中最容易撞上的报错集中列一下,每个都给判断方法和处理动作。
401 Unauthorized 是最常见的。出现这个基本是 Key 的问题:要么 Key 复制的时候带了空格,要么 Key 已经失效,要么 Base URL 写错了。检查顺序是先用模型对话页面发一条消息,确认 Key 本身能用;能用的话再检查 TraeCN 里的 Base URL 是不是https://taotoken.net/api,注意结尾不要多斜杠也不要少。如果 Key 是在控制台刚建的,等几秒再试,有时候有同步延迟。
local proxy failed 这个报错通常出现在工具试图走本地代理但代理没起来的时候。处理方式是检查 TraeCN 的网络配置里有没有开本地代理选项,如果有就关掉,让它直连 API 地址。另外确认系统环境变量里没有残留的 HTTP_PROXY 或 HTTPS_PROXY 指向一个不存在的端口。这个报错和网络环境有关,按这两步排查基本能解决。
reading choices 报错一般出现在模型返回格式和工具预期不一致的时候。表现是请求发出去了,但解析响应失败。原因可能是 Model ID 选错了,选了一个不返回标准 choices 结构的模型。解决办法是换一个兼容 OpenAI 格式的 Model ID,在模型对话页面先测一下返回结构是否正常。
OAuth 相关报错出现在用账号授权方式登录的工具里。如果你用的是 API Key 方式,一般不会碰到。真遇到了,检查是不是同时开了两种认证方式导致冲突,关掉 OAuth 只留 Key 认证即可。
还有一个不在列表里但很烦的问题:AI 生成的代码编译过了但运行崩溃。这种多半是空指针或者信号槽连接失败。排查方法是让 TraeCN 看崩溃时的调用栈,把栈信息贴给它,它能定位到具体哪一行。Qt 的信号槽如果 connect 返回 false,运行时不会报错但槽函数不执行,建议在 connect 后面加个断言检查返回值。
6. 把 AI 编程用顺的几个实际经验
八小时跑完这个 Demo 之后,我最大的感受是:AI 编程的效率瓶颈不在 AI 本身,而在你能不能把需求说清楚。同样的功能,你说"做个配置界面"和你说"做一个带基本配置和高级配置两个分组、每个配置项有标签和输入框、部分项是下拉框、数据从 ini 文件读写的界面",生成质量差很远。程序员思维在这里体现为把模糊需求拆成具体的、可验证的步骤。
另一个经验是报错信息要完整贴给 AI。我前面遇到的三个编译错误,都是原样把编译器的输出贴过去,包括文件路径、行号、错误类型。AI 拿到这些信息后定位很快,比你自己一行行看代码高效得多。这一点在 Qt 这种模板报错又长又绕的场景下尤其明显。
关于使用时段,白天用 TraeCN 确实容易排队,我遇到过排一两千人的情况。晚上的响应速度明显好很多,基本不用等。如果你赶项目进度,可以把需要 AI 大量生成代码的环节安排在晚上,白天做调试和验证。
最后说下版本号这个细节。用 SVN 或 git 的版本号作为软件版本,配合 AI 生成代码,有个额外好处:每次 AI 改完代码提交,版本号自动变,你能清楚知道哪个版本是 AI 生成的、哪个版本是手动调的。这对后期排查问题很有帮助。源码文件加关键字属性这一步别忘了,不然$Rev$不会自动替换。
整套流程跑下来,Qt 上位机从零到可运行,AI 承担了工程创建、界面生成、配置逻辑、版本号集成这些重复劳动,你负责的是需求描述、报错反馈和最终验证。这个分工目前来看是最高效的。