news 2026/10/23 1:24:00

VS2017新增Qt Ui界面:完整流程与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VS2017新增Qt Ui界面:完整流程与避坑指南

在 Visual Studio 2017 里做 Qt 开发,很多人上手就卡在“新增 Ui 界面”这一步。照理说 Qt 界面设计不就是拖控件、改属性嘛,但 VS2017 和 Qt 天生是两套体系:Visual Studio 管 C++ 工程,Qt 靠 uic 和 moc 在编译前生成一堆额外代码。你从“添加新项”里找到那几个 Qt 模板时,可能已经踩进了第一条坑。这篇文章就把 VS2017 Qt 新增 Ui 界面的完整流程讲清楚,包括怎么生成界面类、怎么让设计器里的内容真正变成可编译的 C++ 代码、以及各个阶段最常出问题的位置。内容主要适用于 Qt 5 + Qt MSBuild 方式的 .vcxproj 工程,如果是 Qt CMake 模式,思路一致,只是触发生成规则的方式不同。适合刚开始在 VS2017 里写 Qt 的同学,也适合从 Qt Creator 转过来、被 VS 生成规则搞晕的人。

1. 先搞清楚:在 VS2017 里新增 Ui 界面,难点和套路是什么

1.1 为什么这事在 VS2017 里比在 Qt Creator 里麻烦

我帮别人看项目时,听到最多的一句提问是:“为什么我在 VS2017 里点添加新项,找不到任何 Qt 的东西?”这句话背后其实是对两套工具链的误解。

Qt Creator 是一套完整的 Qt 一体化环境,新建项目向导直接给你一个可运行的界面工程,.ui 文件也是编辑器里的头等公民。而 Visual Studio 2017 本身不认识 Qt,必须安装 Qt VS Tools 扩展才能识别 Qt 工程。就算扩展装好了,VS 也只是把 Qt 支持理解成“额外的自定义生成步骤”:.ui 文件会被 uic 转成 ui_xxx.h,带 Q_OBJECT 的类会被 moc 转成 moc_xxx.cpp。这些生成过程不是写在 C++ 源码里的,而是写在 .vcxproj 工程文件的规则里。

所以新增 Ui 界面这件事,本质上是“在一个外在的构建系统里,触发另一套构建工具去工作”。很多人没理解这一点,于是出现了各种看起来毫不讲理的报错:保存了 .ui 文件但代码里找不到控件、编译提示 ui_xxx.h 不存在、按钮连了信号但怎么点都没反应。把这些问题的根因按住,后面所有操作都能对号入座。

1.2 三种新增界面的方式,哪种适合你

在 VS2017 的 Qt 项目里,新增 Ui 界面大致有三种姿势。先看一张表,再看后面的分析。

新增方式适合场景是否可视化复杂度
直接在主窗体上堆控件小改动、单页面是最低
新建 Qt Widget Class(带 ui 文件)新增对话框、独立面板、多页面是推荐
新建纯 C++ 类,不建立 ui 文件界面简单、逻辑为主否中
新建 Qt Designer Form 独立表单想复用同一套 ui 模板是高

直接在 MainWindow 上堆控件,适合把一个小按钮、一组设置项加到现有界面里,不动工程结构。但如果每次都这么干,MainWindow 的类会越写越胖,界面复杂后一场灾难。

新建 Qt Widget Class 是最常规的做法。它相当于 Qt Creator 里的“Qt 设计师类”,向导会同时生成三个文件:类头文件、类实现文件、以及一个 .ui 表单文件,并且自动把三者关联好。新对话框、新页面、新弹窗,首选都是它。

新建纯 C++ 类适合那些不需要可视化的编辑器窗口,比如一个设置管理器对象、一个纯逻辑组件。没有 ui 文件就没有 uic 环节,干净是干净,但如果你预感后面要在上面放控件,还不如一开始就带 ui。

最后一种 Qt Designer Form 是独立表单文件,它只生成一个 .ui 文件,不会自动生成配套类。适合做模板,比如同一套表单给多个不同业务类用。这个东西后期绑定类很麻烦,新手不建议用。

1.3 我推荐的方案:向导生成 + 设计器排版 + 手动调用

常规的推荐是第二种,也就是用 Qt VS Tools 的 Qt Widget Class 向导。理由很简单:Qt 官方设计器负责可视化,uic 负责把 ui 文件转成 C++,moc 负责处理信号槽元对象,向导一次性把这三样都配齐了。

其他方式不是不能用,而是容易漏步骤。比如你手动添加一个类,再手动添加一个 .ui,还要自己去改 .vcxproj 让 uic 识别,这中间只要漏一步,后面就是一个 C1083 报错等着你。用向导生成,至少能保证前置步骤是完整的,剩下的事就是排版、保存、调用。这个思路贯穿整篇文章。

2. 动手之前,先把环境、项目和目录理顺

2.1 检查 Qt VS Tools 插件,版本和编译器位数要匹配

如果添加新项时根本看不到 Qt 分类,先检查扩展是否装好。在 VS2017 里打开“工具”菜单,找到“扩展和更新”,在“已安装”里找到 Qt VS Tools,确认没有被禁用,版本也别太老。

扩展装好后,还要告诉 VS 你机器上的 Qt 版本在哪里。入口一般在菜单栏的“扩展”(有的版本叫 QTools)里,找到 Qt Options 或者 Qt Versions 配置项,点添加之后选择 Qt 安装目录。以 Qt 5.12 为例,目录结构通常是C:\Qt\Qt5.12.12\5.12.12\msvc2017_64,需要填的是包含bin、lib、include的这层目录,也就是msvc2017_64。

这里最容易踩坑的是编译器位数。Qt 安装包分msvc2017(32位)和msvc2017_64(64位),VS 的解决方案平台也要对应 x86 和 x64。配置不一致是什么结果?编译时一堆找不到 Qt 符号的链接错误,类似LNK2019 unresolved external symbol,看着是代码问题,实际是环境配对问题。改法也很简单:在 VS 工具栏上把解决方案平台切成 x64,或者把 Qt Options 里的版本换成 32 位那一套,总之位数必须对齐。

2.2 分清 Qt MSBuild 和 Qt CMake,别用错操作入口

VS2017 里的 Qt 项目通常有两种构建方式:Qt MSBuild(右键项目能看到 Qt 菜单的 .vcxproj)和 Qt CMake(使用 CMake 工程)。

MSBuild 方式由 Qt VS Tools 在工程文件里写好了自定义生成规则,新增 Ui 界面后能看到 GeneratedFiles 目录,出现问题基本都是这套规则的触发时机不对。CMake 方式则不一样,ui 文件由 CMake 的 AUTOUIC 选项自动处理,不需要 GeneratedFiles 目录,但前提是你的 CMakeLists.txt 里有set(CMAKE_AUTOUIC ON),并且把新加的 .ui 文件写进了add_executable或add_library。

下面讲的操作按 MSBuild 方式为主,绝大多数老项目也都是这种。如果你打开项目后右键看不到 Qt 菜单,要么是插件没加载成功,要么是工程没有被识别为 Qt 工程,先别急着加界面,停下来查环境。

2.3 目录规划和命名规范,减少后续排查成本

新增 Ui 界面之前,建议先把目录理顺。很多人把所有文件堆在项目根目录,这个习惯在 Qt 项目里会让 GeneratedFiles、ui_xxx.h、moc 文件混在一起,排查问题时要多花不少时间。

最好按模块分目录,比如dialogs/放对话框,widgets/放自绘控件,pages/放多页面,这样后续找文件很直观。名字规范也重要:类名用 PascalCase,比如LoginDialog,文件名建议 snake_case,比如login_dialog.h、login_dialog.cpp、login_dialog.ui。不强求,但保持一致能省很多事。还有一个容易被人忽略的点:目录路径里不要有中文和特殊符号,否则某个版本的 uic 在处理路径时可能抽风。

3. 五步完成新增 Ui 界面:向导、设计、生成、调用全流程

3.1 第一步:用 Qt Widget Class 向导生成类和表单

打开 VS2017,在解决方案资源管理器里右键项目名称,选择“添加” -> “新建项”。左侧模板树里找到“Qt5”(或者是“Qt”,取决于插件版本),右侧会出现几个模板:Qt Class、Qt Widget Class、Qt Designer Form Class 等。

选择Qt Widget Class,这是最方便的一个模板。类名填一个含义清晰的,比如LoginDialog;基类下拉框里选QDialog。如果你要做的是主窗口里的一块面板、不是弹窗,基类就选QWidget;如果是独立应用主窗口,选QMainWindow。关键的一步:确保勾选了Generate form file,也就是生成表单文件。如果不勾,生成的只是一个纯 C++ 类,没有 ui 文件,也就没有可视化界面。点确定后,VS 会自动把三个文件加进工程。

这里有个小提示:如果模板列表里没有 Qt Widget Class,只有 Qt Class,说明插件版本略旧。解决办法是选 Qt Class 生成后,再右键项目添加一个 Qt Designer Form,手工关联。能用前者当然更好,省事。

3.2 第二步:认识生成出来的 .h / .cpp / .ui 三件套

向导生成的LoginDialog.h是这个样子(不同插件版本细节略有差异):

#pragma once #include <QtWidgets/QDialog> namespace Ui { class LoginDialog; } class LoginDialog : public QDialog { Q_OBJECT public: explicit LoginDialog(QWidget *parent = nullptr); ~LoginDialog(); private: Ui::LoginDialog *ui; };

LoginDialog.cpp对应是这样:

#include "LoginDialog.h" #include "ui_LoginDialog.h" LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent) , ui(new Ui::LoginDialog) { ui->setupUi(this); } LoginDialog::~LoginDialog() { delete ui; }

看到ui指针和setupUi这两个词,就知道这个类和 .ui 文件已经绑定了。构造函数里先把ui指向一个新的Ui::LoginDialog对象,再调用setupUi(this),这一步会在运行时把所有控件创建并挂到当前对话框上。所以如果构造函数里漏了setupUi,或者注释掉了,界面就是一片空白,但编译却不报错,这个问题后面还会提到。

3.3 第三步:在 Qt 设计师里排布控件和布局

在解决方案资源管理器里双击LoginDialog.ui文件,VS 会打开内置的 Qt 设计师视图。左侧是控件工具箱,中间是表单画布,右侧是对象树和属性面板。

拖控件时有几个细节要记住:

  • 先往画布上拖一个 QGroupBox 作为容器,再往里面放 QLabel、QLineEdit、QPushButton 这类控件。
  • 选中容器内的一组控件,用工具栏上的“栅格布局”或“垂直布局”先形成局部布局,再对整个页面做一个顶层布局。这个“先内后外”的顺序能保证窗口拉伸时控件会跟着缩放,而不是固定在左上角。
  • objectName 一定要改。例如把用户名输入框改成usernameEdit,登录按钮改成loginBtn。后面写 C++ 代码时,ui->usernameEdit全靠这个名字查找,不改名就只能用默认的lineEdit、pushButton,界面复杂以后根本分不清谁是谁。

改完保存文件,这是所有后续生成的前提。不保存 .ui,一切都不会更新。

3.4 第四步:保存并触发 uic,让 ui_xxx.h 出现

保存 .ui 文件后,VS 在编译时会在项目目录下生成GeneratedFiles文件夹,里面会有ui_LoginDialog.h和moc_LoginDialog.cpp。但现实是,很多时候保存了并没有立刻生成,因为工程文件里的文件列表还没有刷新。

正确的触发方式:右键项目,找到 Qt 菜单,点击Run qmake,然后再Ctrl+Shift+B重新生成解决方案。运行 qmake 的意义是让 Qt 重新分析工程里的文件列表,把新增的 ui 文件纳入 uic 的生成范围。

不少同事第一次新增 Ui 界面后直接编译,报 C1083 无法打开ui_LoginDialog.h,就是跳过了这一步。这个错很容易破:先跑 qmake,再重新生成,九成能解决。如果还不行,看看 .vcxproj 里有没有包含新加的 .ui 文件,有时候解决方案资源管理器里看到文件在,但工程文件里没登记,等于白加。这个情况我后面还会复盘。

3.5 第五步:把新窗口显示出来,或者嵌进主界面

界面做出来最终是要显示出来的。如果新加的 Ui 界面就是要作为程序的主窗口,在 main.cpp 里这么做:

#include <QApplication> #include "LoginDialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); LoginDialog w; w.show(); return a.exec(); }

如果是要弹出模态对话框,用exec()。我在实际项目里更常用的是点击某个按钮时弹出登录对话框,比如在主窗口的某个槽函数里:

#include "LoginDialog.h" void MainWindow::onLoginClicked() { LoginDialog dlg(this); if (dlg.exec() == QDialog::Accepted) { // 登录成功后继续处理 } }

这里有个细节:传this给父对象。这样对话框会有主窗口作为父级,关闭主窗口时对话框也能被清理,避免出现“主窗口都关了,登录框还在屏幕角落”这种幽灵窗口。如果只是想在主界面里切换页面,不建议反复弹窗,后面在 6.4 里会说更合适的办法。

4. 新界面背后的三个关键原理,理解了才不会被生成文件牵着走

4.1 .ui 文件其实是 XML,uic 负责把它变成 C++

很多新手以为 .ui 文件是某种可视化图片或二进制格式,其实它就是一个 XML 文本。打开LoginDialog.ui能看到类似下面的结构:

<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>LoginDialog</class> <widget class="QDialog" name="LoginDialog"> <property name="geometry"> <rect> <x>0</x><y>0</y><width>400</width><height>300</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLineEdit" name="usernameEdit"/> </item> </layout> </widget> </ui>

uic 工具做的就是把这个 XML 读进来,生成一个 C++ 的ui_LoginDialog.h,里面实现一个setupUi函数。这个函数会按树形结构 new 出所有控件,设置属性,然后挂到对应的父对象上。所以你在设计器里看到的每一条属性,最终都会变成ui_LoginDialog.h里的一行行代码。

这也解释了为什么修改了 .ui 文件后不重新编译,界面上看到的还是旧东西。因为旧版本的 ui_xxx.h 还躺在 GeneratedFiles 里,编译器用的还是它。

4.2 moc 和 GeneratedFiles,是信号槽能工作的基础

Qt 的元对象系统给了 C++ 一种原生没有的能力:信号槽。但 C++ 编译器不认signals、slots、Q_OBJECT这些关键字,所以 moc 工具会在编译前扫描头文件,只要发现Q_OBJECT宏,就生成一个对应的moc_LoginDialog.cpp,里面包含类的元对象描述、信号槽索引、属性信息。

在 VS2017 里,这些生成文件默认放在GeneratedFiles目录下,不会出现在源码目录。如果你把类里的 Q_OBJECT 注释掉,编译通常能正常通过,但 connect 的信号永远触发不了,因为元对象信息不存在。这个坑很隐蔽,表现是:按钮怎么点都没反应,代码里也没报错。

所以新增 Ui 界面时,生成的类头文件里 Q_OBJECT 不要删,所有用到 connect 的类都得有 Q_OBJECT(如果是纯 Q_GADGET 的的轻量类也需要单独考虑)。GeneratedFiles 目录如果被清理工具误删了,重新运行 qmake 就能重建。

4.3 命名空间 Ui 和 setupUi,究竟在做什么

回头看看头文件里那行namespace Ui { class LoginDialog; },这是前置声明,不是引入完整的 ui_xxx.h。这么设计有两个好处:

一是减少头文件之间的相互包含。如果 MainWindow 的头文件直接 include ui_MainWindow.h,那么一旦 ui 文件里结构变化,所有包含 MainWindow.h 的文件都会被牵连重编。前置声明让 ui_xxx.h 变成实现细节,只有 .cpp 文件才真正包含它。

二是强制界面结构和使用逻辑分离。ui指针指向一个由 uic 生成的类,这个类的成员变量是设计器里每个控件的指针。调用setupUi(this)后,这些控件指针才真正指向已创建的对象。你只在ui->usernameEdit这一类写法中和界面打交道,不会出现几百个控件成员变量挤在类头文件里的状况。

这个设计在大项目里收益极其明显。记住一个原则:头文件尽量不给 Ui 细节,源文件再包含 ui_xxx.h。

5. 常见问题与排查实录

5.1 一张速查表对照最常见的 8 类报错

下面把 VS2017 Qt 新增 Ui 界面过程中最常见的报错汇总一下,方便查阅。

现象大概率原因处理办法
编译报 C1083:无法打开 ui_LoginDialog.h新增 ui 后没运行 qmake,或文件没加入工程右键项目 Qt -> Run qmake,再重新生成
编译报 moc 文件重复或冲突生成规则被复制了多次清空 GeneratedFiles 后重新生成解决方案
修改 .ui 后界面运行无变化uic 没有重新执行强制重新生成,或删除 GeneratedFiles 后 Rebuild
按钮点击无反应,connect 不生效类头文件缺少 Q_OBJECT,或 connect 对象不对检查元对象宏,重新运行 qmake 再编译
链接报 LNK2019 找不到 Qt 符号Qt 版本目录和解决方案平台位数不一致在 Qt Options 里改版本,或将平台切成 x64/x86
设计器打开是空白的Qt VS Tools 插件加载异常重启 VS,必要时禁用再启用扩展
工具箱里没有 Qt 控件项目没被识别为 Qt 工程配置 Qt Options,检查 .vcxproj 是否包含 QtBuild 配置
运行时窗口空白,一个控件都看不到构造函数里没调用 setupUi检查 ui 指针是否初始化并调用 ui->setupUi(this)

这张表的核心还是那句话:生成文件的问题,优先从 qmake 入手。

5.2 两个典型翻车过程复盘

第一个翻车:我接手过的一个项目里,同事新增了一个查询界面,编译一直报 C1083 无法打开 ui_XXX.h。我照惯例跑了一次 qmake,没用。后来打开 .vcxproj 一看,那个 .ui 文件根本没有被登记到工程文件里。解决方案资源管理器里能看到文件,只是因为磁盘上存在,VS 没把它加入编译。删掉这个不存在的项目项,再右键添加现有项,把 .ui 文件加回来,编译就通过了。这个经历告诉我:新增界面后,第一件事是确认文件真的进了工程列表,而不只是放在磁盘上。

第二个翻车:另一个项目里,界面上的一个按钮始终没反应,代码里 connect 写得很正常,槽函数也实现了。排查了很久,最后发现是类的头文件里 Q_OBJECT 被注释掉了——可能是之前为了临时解决某个编译错误删的。Q_OBJECT 没了,moc 就不会生成完整的元对象代码,信号槽被静默切断,编译不报错,运行也不报错,就是没响应。恢复 Q_OBJECT 之后,重新运行 qmake,一切恢复正常。这类问题是最磨人的,因为它完全不给你任何报错线索。

6. 新界面要真正好用,这几个细节别跳过

6.1 用“提升控件”让占位区域变成自定义组件

在 UI 设计里,你经常希望在某个区域放自定义控件,比如一个自己写的波形图、一个图表组件、一个画板。实现方式不是在设计器里把 QWidget 拖进去然后在代码里再 new 一个替换,Qt 设计师提供了“提升为”功能,也就是 Promote。

操作路径:选中画布上的普通 QWidget,右键 -> 提升为…,在弹窗里填提升类名,比如WaveWidget,头文件填wavewidget.h,然后点“添加”,最后“提升”。完成后,uic 生成的代码就会直接创建WaveWidget而不是 QWidget,构造函数自动带上父对象。这样做最大的好处是不需要手动 new、手动 setParent、手动加布局,设计器里所见即所得。

注意两个细节:提升类的头文件必须在项目的 include 搜索路径里,否则 uic 生成的 include 指令会让编译器找不到头文件;提升之后不要在普通代码里继续 new 一个 QWidget 放到同样位置,会重复创建对象,界面层叠混乱。

6.2 用资源文件和 QSS 保证界面观感统一

一个项目里新增多个界面后,最容易出现的问题就是风格不统一:这个窗口背景是白的,那个窗口字体是默认的,图片路径写得到处都是。解决这个问题最好的方式是 QSS,也就是 Qt 的样式表,配合 qrc 资源文件。

在 main.cpp 的 QApplication 对象创建之后,直接加载整个应用的 QSS:

QFile styleFile(":/style/app.qss"); styleFile.open(QFile::ReadOnly); app.setStyleSheet(styleFile.readAll());

如果只是某个对话框单独设置,也可以在构造函数里setStyleSheet(...)。QSS 里引用图片时用url(:/images/login_bg.png),这里的:/前缀就是 qrc 资源系统的约定。

在 VS2017 里打开 .qrc 文件,右侧是资源编辑器,点“添加”可以放图片和静态文件。记得先加前缀,比如 /images、/style,再接文件。资源路径一旦变化,qrc 对应的 qrc_xxx.cpp 也会重新编译,所以引用的路径必须和资源编辑器里的前缀保持一致。图片如果走文件系统相对路径,发布时很容易丢,用 qrc 打包进 exe 更稳健。

6.3 布局顺序决定窗口拉伸后的表现

新增界面时最容易被忽视的是布局顺序。有人把控件拖得整整齐齐,结果窗口一拉大,控件纹丝不动留在左上角;或者窗口缩小,控件被裁剪。这就是没加布局或布局层级不对。

我个人的操作习惯是“先内后外、先清后布”。内层先处理:比如一个设置区域里有多行控件,先把这些控件选中,应用一个垂直或栅格布局,这样它们变成一个整体;外层再处理:把各个区域(GroupBox、按钮组的占位)选中,应用一个顶层栅格布局,让整个页面随窗口变化。如果发现布局加错了,右键 -> 布局 -> 清空布局,重新开始,比在上面反复叠布局靠谱得多。

另外在对象树里选控件,比在画布上框选更精准。很多新手在 GroupBox 外直接应用栅格布局,以为能把里面的子控件也覆盖到,结果只有 GroupBox 自己变了。正确做法是先到对象树里选中 GroupBox 内部的所有子项,再做子布局。

6.4 多界面切换的两种切入姿势

如果新增的 Ui 界面不是独立窗口,而是主窗口里的一块页面,我不会用弹窗,而是用 QStackedWidget。先在主界面放一个 QStackedWidget,把新增的面板界面作为其中一页,需要切换时调用setCurrentWidget。这种方式干净,便于做页签式切换,也方便后续继续增加页面。

另一种方式是动态创建面板,把createPanel()返回的 QWidget 实例直接放进某个布局中。这种方式适合临时出现的浮层,比如状态栏弹出的设置面板。好处是灵活,坏处是管理生命周期麻烦,容易忘记释放。

所以在需求阶段就分清目标和基类选择很重要。如果做出来的是需要反复弹出的确认框、登录框,基类选 QDialog,用 exec();如果做的是主界面里的菜单页、工作区页,基类选 QWidget,用 QStackedWidget 管理。基类选错会导致后面接口对不上,改起来比重新加类还费劲。


我在实际项目里绕了这么多弯,最后养成的习惯是:先把类名、目录想好,再用 Qt Widget Class 向导一次生成三件套;设计器里排完版,保存后立刻右键项目运行 qmake;跑一次编译确认 ui_xxx.h 正常生成,最后才去写调用代码。这套流程看起来每一步都多花了十几秒,但它帮我省掉的排查时间远远更多。VS2017 和 Qt 的组合确实不如 Qt Creator 一体化那么顺,但把“生成”这件事看透,新增 Ui 界面其实也就是一个固定的流程,走顺了就不会再怕它。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 1:23:59

ARM、DSP、FPGA怎么选?电机控制与电源控制芯片架构深度解析

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

作者头像 李华
网站建设 2026/10/23 1:23:45

STM32嵌入式开发入门:从内核到外设全面解析

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

作者头像 李华
网站建设 2026/10/23 1:23:32

嵌入式面试:从玩具级到工程级,STM32与Linux工程闭环设计

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

作者头像 李华
网站建设 2026/10/23 1:23:23

Cursor 编辑器深度使用指南:从安装配置到 AI 编码实战技巧

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

作者头像 李华
网站建设 2026/10/23 1:21:21

AI生成小说全流程:从大纲到成稿的可复用工作流与提示词模板

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

作者头像 李华
网站建设 2026/10/23 1:21:19

Cursor配额机制与账户保活实战指南

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

作者头像 李华