Qt窗体背景颜色设置指南:QPalette原理与实战
如果你稍微搜过 Qt 窗体背景颜色的设置方法大概率会看到两种方案一种是setStyleSheet(background-color: ...;)另一种就是本文要讲的QPalette。我个人的建议是临时改色用 QSS 很爽但一旦项目里要做多主题、换肤、跟随系统状态切换QPalette才是正经路子。这篇文章我打算围绕“基于 QPalette 设置窗体背景颜色”这件事把原理、写法、常见失效原因和一套可复用的扩展思路都过一遍适合刚上手 Qt6 的朋友也适合被setPalette不生效坑过的同学。1. 先从 Qt 的颜色机制说起为什么 QWidget 没有 setBackgroundColor1.1 控件外观不是“一个颜色属性”决定的很多刚接触 Qt 的人会疑惑为什么QWidget这么基础的控件居然没有一个类似setBackgroundColor的方法原因很简单Qt 控件的外观由“样式系统 调色板 控件自身的绘制代码”共同决定而不是由某个孤立的属性直接驱动。QPalette本质上是一套“分角色、分状态”的画刷/颜色管理结构。它不仅有背景色还有前景色、文本色、高亮色、按钮色等十几个角色每个角色又分Active、Inactive、Disabled三组状态。Qt 内建的QStyle在绘制控件时会按照控件当前所处状态去QPalette里查对应角色的画刷来画。所以设置窗体背景颜色这件事本质上是往QPalette的Window角色里写入一个颜色然后让窗口在重绘时使用这个颜色。这不是一个“给控件染个色”的动作而是“替换该控件使用的整套配色方案中的一个色位”。1.2 QColor、QBrush、QPalette 三者的关系很多教程里会把三者混在一起写经常把人绕晕。我用一个不那么严谨但好记的类比QColor就是一管颜料只管“颜色是什么”比如QColor(#2E3440)。QBrush是一把刷子它决定“怎么把这个颜色刷上去”。刷子可以是纯色也可以是渐变、纹理甚至贴图。QPalette是一个完整的“油漆方案”它给控件每个部位分配好了各自该用什么刷子哪里刷背景、哪里刷文字、哪里刷高亮。所以当你写palette.setColor(QPalette::Window, QColor(#2E3440));这行代码的完整含义是在调色板里把“控件背景区域”对应的画刷设置成#2E3440的纯色画刷。而QPalette::Window这个角色对应的就是QWidget的默认背景区域。有个易混淆点需要提醒QPalette::Window并不等于操作系统里的“窗口标题栏”或“窗口边框”。它指的是用 Qt 绘制的这个 widget 的客户区背景。真正系统标题栏的颜色QPalette管不着那是窗体系统负责的。2. 设置背景颜色前必须搞懂的两个关键点ColorRole 和 AutoFillBackground2.1 为什么是QPalette::Window而不是QPalette::Base新手最容易混淆的就是Window和Base这两个角色。Window是通用控件的背景角色比如QWidget、QDialog、QMainWindow的默认背景都用它。而Base主要用于那些“可以输入/编辑内容的控件”的背景比如QLineEdit、QTextEdit、QComboBox的下拉区域。很多示例代码里会直接写QPalette::Base如果你把它用在一个普通QWidget窗体上往往看不到效果因为你改的不是这个控件绘制背景时会查询的那个角色。判断标准很简单你想改的那块区域是这个控件自己负责绘制的“外壳背景”还是里面某个文本编辑子控件的“内容底子”。对于窗体整体背景绝大多数情况下认准QPalette::Window就对了。2.2setAutoFillBackground(true)到底在补什么这是另一个高频翻车点。QWidget默认情况下不会主动把自己的背景填满。它只是一个“空壳”由父级窗口或底层绘制来填充。只有部分内部子类比如QFrame、QLabel、QPushButton会自己绘制背景。所以当你只对普通QWidget调用了setPalette却不打开setAutoFillBackground(true)有时会看到颜色没有按预期铺满整个窗体。setAutoFillBackground(true)的作用是告诉 Qt 在绘制这个控件时先自动用当前调色板里的Window角色把整个区域填满然后再继续画子控件。这相当于给控件加了一层“底色打底”的默认行为。所以最基础的标准写法是QPalette palette ui-centralWidget-palette(); palette.setColor(QPalette::Window, QColor(#F6F6F6)); ui-centralWidget-setPalette(palette); ui-centralWidget-setAutoFillBackground(true);注意setAutoFillBackground只需要在继承自QWidget的“容器型”控件上显式打开。如果你直接把调色板设置到QMainWindow的centralWidget上而 centralWidget 本身是QWidget那这行是必须的。2.3 ColorGroup 的坑状态不同颜色可能就变QPalette里每种角色都有三组状态QPalette::Active当前处于激活状态的窗口。QPalette::Inactive窗口处于非激活状态比如用户点了另一个窗口。QPalette::Disabled控件被禁用比如setEnabled(false)。只调用palette.setColor(QPalette::Window, color)时设置的是哪个组我这里不和你绕文档细节直接给一个稳妥习惯如果希望一个窗体在任何状态下背景都保持一致就显式把三组都设一遍。QPalette palette; const QColor bg(#2E3440); palette.setColor(QPalette::Active, QPalette::Window, bg); palette.setColor(QPalette::Inactive, QPalette::Window, bg); palette.setColor(QPalette::Disabled, QPalette::Window, bg); widget-setPalette(palette); widget-setAutoFillBackground(true);很多人在做“禁用态高亮”之类的效果时发现颜色不对最后排查半天其实就是因为没有设置Disabled组。如果你希望禁用时背景变灰那正好可以故意把Disabled组的颜色设成另一种达到视觉区分的效果。3. 从最小示例到高级玩法纯色、半透明、渐变和动态刷新3.1 最小可运行示例下面是一个完整的最小窗体直接在构造函数里设置背景色#include QWidget #include QPalette #include QColor class DemoWindow : public QWidget { public: DemoWindow(QWidget *parent nullptr) : QWidget(parent) { setWindowTitle(QPalette 背景示例); resize(480, 320); QPalette pal palette(); pal.setColor(QPalette::Window, QColor(46, 52, 64)); setPalette(pal); setAutoFillBackground(true); } };如果你在QMainWindow上测试记得不要直接把调色板设到QMainWindow本身而是设到它的centralWidget。因为QMainWindow本身是一个复杂的容器背景绘制由它的内容区域承担QPalette pal ui-centralWidget-palette(); pal.setColor(QPalette::Window, QColor(#F0F0F0)); ui-centralWidget-setPalette(pal); ui-centralWidget-setAutoFillBackground(true);这是一种更贴近实际项目的写法。3.2 半透明背景必须打开 WA_TranslucentBackgroundQPalette是可以接收带 alpha 通道的颜色的但这里有个前提默认情况下普通QWidget的 alpha 通道会被窗口系统忽略最终显示出来的还是不透明背景。想要实现真正的半透明窗体需要先设置Qt::WA_TranslucentBackground属性setAttribute(Qt::WA_TranslucentBackground); QPalette pal palette(); pal.setColor(QPalette::Window, QColor(30, 30, 30, 180)); setPalette(pal); setAutoFillBackground(true);这样设置之后窗体就会有类似“黑色玻璃”的半透明效果。需要注意的是WA_TranslucentBackground开启后Qt 不再提供传统的不透明背景窗口整体变成一个“可以参与透明混合的图层”这会带来额外的合成开销。窗口里面如果有大量频繁更新的控件半透明场景下的性能和视觉表现都值得专门测试。3.3 渐变背景换掉 QBrush别只盯着 QColorQPalette里真正存的是QBrush不是QColor。这意味着你完全可以放一把“渐变刷子”进去。QLinearGradient gradient(0, 0, width(), height()); gradient.setColorAt(0.0, QColor(#FF7E5F)); gradient.setColorAt(1.0, QColor(#FEB47B)); QPalette pal palette(); pal.setBrush(QPalette::Window, QBrush(gradient)); setPalette(pal); setAutoFillBackground(true);渐变坐标需要解释一下QLinearGradient(0, 0, width(), height())里的坐标是相对于当前 widget 的逻辑坐标。如果窗体大小为(480, 320)那这个渐变就是从左上角到右下角的对角渐变。这里有一个实测时容易出现的小问题如果窗体支持拉伸你应该在resizeEvent里重新构造渐变并重新setPalette否则渐变方向、位置和缩放比例可能会和预期不一致。更省心的做法是让渐变始终跟随窗体实际尺寸void DemoWindow::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); QLinearGradient gradient(rect().topLeft(), rect().bottomRight()); gradient.setColorAt(0.0, QColor(#FF7E5F)); gradient.setColorAt(1.0, QColor(#FEB47B)); QPalette pal palette(); pal.setBrush(QPalette::Window, QBrush(gradient)); setPalette(pal); setAutoFillBackground(true); }3.4 动态切换颜色与刷新有时候我们需要在运行过程中动态切换背景颜色比如按下某个按钮从深色切到浅色。此时只需要重新生成调色板并重新设置即可setPalette本身会触发重绘void applyBackground(const QColor color) { QPalette pal palette(); pal.setColor(QPalette::Window, color); setPalette(pal); // 如果当前 widget 的 autoFillBackground 之前已经被置为 false这里建议再开一次 setAutoFillBackground(true); }实测下来这样的刷新速度足够快不需要手动调用update()。但如果是经过复杂样式表包装的控件刷新逻辑会引入“样式表重算”的开销这种情况更推荐把样式和调色板分开处理见后面的第五节。4. 踩坑实录为什么你的 setPalette 经常不生效4.1 样式表的优先级压过了 QPalette这是最常见的原因没有之一。只要项目里任何一个控件或全局qApp-setStyleSheet(...)中出现了和背景颜色相关的规则Qt 会优先使用样式表的结果而不理会QPalette。因为样式本身就是一种“更高等级的外部主题覆盖机制”。例如你写了qApp-setStyleSheet(QWidget { background-color: #333333; });然后再在某处对某个窗体设置setPalette你会发现完全看不到调色板的效果。排查时先搜一下项目里有没有全局QSS有的话先在样式表里去掉对应的背景规则再回来验证调色板。4.2 父窗口背景没有自动“透传”给子控件有时候你把QPalette设置在上层窗口上也确实打开了setAutoFillBackground(true)但窗体里面的QLabel、QPushButton等子控件还是各自带着自己的默认背景。这是因为子控件默认会用自己的QPalette绘制而不是自动继承父窗口的背景。Qt 的调色板“继承”逻辑是逐级向下的但一旦某个控件本身有绘制背景的动作父窗口背景就会被它盖住。解决办法有两种如果只是希望子控件透明可以把子控件设置为透明背景widget-setAttribute(Qt::WA_NoSystemBackground)或者直接给子控件也设置对应颜色的调色板。如果子控件很少最简单的是把子控件也统一纳入同一个调色板管理见第五节的“语义化调色板”。4.3 原生窗口边框和系统合成器的干扰在 Windows 10/11 上窗口标题栏和阴影是系统画出来的QPalette管不到顶部标题栏但有时会影响客户区边缘的圆角或半透明表现。当你开启WA_TranslucentBackground之后如果系统合成器没有正确配合可能看到黑色底边或闪烁的背景。我实际遇到过的情况是同样一套半透明调色板代码在 Windows 10 上表现正常在 Windows 11 的某些主题下背景边缘出现黑边。这和系统 DWM 合成方式有关不是 Qt 的问题。如果你做的是无边框窗体内的半透明效果需要连同边框裁剪、圆角绘制一起设计光靠QPalette撑不起来。4.4 平台原生样式的“无视”Qt 默认使用平台原生样式例如 Windows 上的windows11样式、Linux 上的gtk样式。这些原生样式往往会对背景颜色做“平台化”处理不完全按调色板来。如果你希望调色板在各平台表现一致建议在main函数里固定使用Fusion样式#include QApplication int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setStyle(Fusion); // ... }Fusion样式对QPalette的还原度很高适合做跨平台统一换肤。代价是视觉效果不再跟随桌面环境。实际项目里可以根据需求权衡。5. 从“改一个背景色”到“管理整套配色方案”5.1 把背景、文本、高亮一起纳入管理只设置一个背景色很容易出现“背景色改了但文字看不清”的尴尬。因为你只处理了Window角色其他文字角色还是老样子。一个更工程化的做法是把常见角色全都封装成一个结构体struct AppColors { QColor window; QColor windowText; QColor base; QColor text; QColor button; QColor buttonText; QColor highlight; QColor highlightedText; QPalette toPalette() const { QPalette p; p.setColor(QPalette::Active, QPalette::Window, window); p.setColor(QPalette::Active, QPalette::WindowText, windowText); p.setColor(QPalette::Active, QPalette::Base, base); p.setColor(QPalette::Active, QPalette::Text, text); p.setColor(QPalette::Active, QPalette::Button, button); p.setColor(QPalette::Active, QPalette::ButtonText, buttonText); p.setColor(QPalette::Active, QPalette::Highlight, highlight); p.setColor(QPalette::Active, QPalette::HighlightedText, highlightedText); // 非激活状态保持一致 p.setColor(QPalette::Inactive, QPalette::Window, window); p.setColor(QPalette::Inactive, QPalette::WindowText, windowText); p.setColor(QPalette::Inactive, QPalette::Base, base); p.setColor(QPalette::Inactive, QPalette::Text, text); p.setColor(QPalette::Inactive, QPalette::Button, button); p.setColor(QPalette::Inactive, QPalette::ButtonText, buttonText); // 禁用状态单独设置 p.setColor(QPalette::Disabled, QPalette::WindowText, QColor(120, 120, 120)); p.setColor(QPalette::Disabled, QPalette::Text, QColor(120, 120, 120)); p.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(120, 120, 120)); return p; } };有了这样一个结构体你不再需要到处硬编码颜色只需要维护一份“当前主题色板”然后把它应用到qApp或指定窗口。5.2 多主题切换时的实践结构假如项目里需要深色/浅色两套主题可以把主题定义成枚举再加一个负责切换的模块enum class ThemeId { Light, Dark }; AppColors loadColors(ThemeId theme) { if (theme ThemeId::Dark) { return AppColors{ QColor(#2E3440), // window QColor(#ECEFF4), // windowText QColor(#3B4252), // base QColor(#ECEFF4), // text QColor(#434C5E), // button QColor(#ECEFF4), // buttonText QColor(#88C0D0), // highlight QColor(#2E3440) // highlightedText }; } return AppColors{ QColor(#F6F6F6), // window QColor(#333333), // windowText QColor(#FFFFFF), // base QColor(#333333), // text QColor(#E5E5E5), // button QColor(#333333), // buttonText QColor(#3D7EFF), // highlight QColor(#FFFFFF) // highlightedText }; }切换时先得到新的QPalette然后QApplication::setPalette(colors.toPalette());全局调色板一旦变化大多数标准控件都会跟随更新背景色、文本色、高亮色一起切换不会再出现“背景亮了字看不清”的问题。5.3 什么时候该放弃 QPalette转投 QSS 或自定义绘制QPalette适合做“颜色级别的主题”但它有两个明显的边界它做不了圆角、阴影、边框宽度这类几何外观。它做不了鼠标悬停、按下瞬间的复杂状态背景切换。虽然按钮的Disabled和Active可以设置但动态交互状态最好交给样式表或自定义绘制。所以我实际项目里的分工很明确全局底色、文字色、高亮色归QPalette管按钮圆角、边框、滑块样式等几何细节归局部 QSS 管特殊的异形窗体再走paintEvent自定义绘制。三者各管一段不会互相打架。最后一个经验不要试图用一个setStyleSheet往所有控件上泼背景色那样迟早会遇到“局部改色失灵”“优先级混乱”“主题切换后残留”这些老问题。把颜色语义化用QPalette做底色管理是 Qt 工程长期维护里最省心的一条路径。至少我后来负责的几个跨平台界面项目都改成了这种做法再也没有被“设置背景不生效”这种问题缠住过。

相关新闻

AI短剧工业化生产:定妆资产规范、主体定义模板与判废表全流程指南

AI短剧工业化生产:定妆资产规范、主体定义模板与判废表全流程指南

1. 短剧工业化生产的前置认知1.1 为什么“定妆资产”决定了短剧的生死做AI真人短剧,很多人第一反应是去研究哪个模型出图更真、哪个工具能一键生成视频。但真正跑过完整项目的人都知道,决定一部短剧能不能顺利做完、能不能保持角色一致性的,从…

2026/10/11 6:49:27 阅读更多 →
软件设计之道:构建可落地的架构决策认知体系

软件设计之道:构建可落地的架构决策认知体系

我干了十几年的软件设计和架构,有一个很深的感触:网上讨论架构的内容,大部分是“术”——这块用个什么模式,那块引入什么框架。但真正拖垮项目的,往往是“道”的层面出了问题。很多人掌握了所有主流的技术栈&#xff0…

2026/10/11 6:49:27 阅读更多 →
TIM定时中断

TIM定时中断

TIM定时器介绍:定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16 位计数器、预分频器、自动重装寄存器的时基单元,在 72MHz 计数时钟下可以实现最大 59.65s 的定时(多久数一次、数了多少次、数到多久重新开始&am…

2026/10/11 6:49:26 阅读更多 →

最新新闻

机器学习端到端项目实战:从数据预处理到模型调优的工程化指南

机器学习端到端项目实战:从数据预处理到模型调优的工程化指南

1. 为什么第二章值得单独写一篇笔记1.1 从“跑通一个模型”到“理解一个项目”的分水岭很多人学机器学习,第一章通常是看概念、装环境、跑一个鸢尾花分类,感觉“我入门了”。但真正开始做项目的人都知道,第一章那种“一行代码加载数据、一行代…

2026/10/11 8:13:18 阅读更多 →
单片机计算机毕设之基于WIFI的骑行速度里程心率血氧远程监测系统设计 基于单片机的自行车骑行生理参数与运动数据监测装置设计(030204)

单片机计算机毕设之基于WIFI的骑行速度里程心率血氧远程监测系统设计 基于单片机的自行车骑行生理参数与运动数据监测装置设计(030204)

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

2026/10/11 8:13:18 阅读更多 →
ADS 4.5样式表未找到?omml2mml.xsl缺失的完整排查与修复方案

ADS 4.5样式表未找到?omml2mml.xsl缺失的完整排查与修复方案

ADS 4.5 的“样式表未找到”报错,我前后折腾了两个小时才彻底解决。第一次弹出“此操作所需样式表 (omml2mml.xsl) 未找到或已过期”这个窗口的时候,我还以为是软件安装包坏了,重装了一遍 ADS,结果问题依旧。后来把矛头转向 Offic…

2026/10/11 8:13:18 阅读更多 →
C# MQTT服务器端源码深度拆解:连接管理、QoS与高并发调优

C# MQTT服务器端源码深度拆解:连接管理、QoS与高并发调优

前阵子做园区智能化集成的朋友跟我吐槽,他们用现成broker搭的MQTT服务器端,设备一多就掉线、消息延迟忽高忽低,项目验收差点黄了。我劝他,与其在黑盒子里转,不如直接吃透一套C# MQTT服务器端的源码框架——从连接管理、…

2026/10/11 8:13:18 阅读更多 →
4400张YOLO格式智慧农业害虫检测数据集实战指南

4400张YOLO格式智慧农业害虫检测数据集实战指南

1. 从一张玉米叶说起:这个数据集到底能干什么去年夏天,一个做智慧农业的朋友发来一张照片,玉米叶片上爬满了密密麻麻的蚜虫,叶背已经开始卷曲发黄。他问我:能不能用视觉模型自动识别出这是什么虫、密度大概多少、需不需…

2026/10/11 8:13:18 阅读更多 →
无人驾驶中的边缘计算:从云端下沉到路边的实时决策

无人驾驶中的边缘计算:从云端下沉到路边的实时决策

这几年一直泡在自动驾驶相关项目里,圈子里的共识慢慢收敛到一件事上:单车智能做得再极致,车还是看不见墙后面的东西。边缘计算下沉到路边,说白了就是想办法让路本身变成车的“眼睛”和“大脑”,把实时决策的时延压缩到…

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

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23: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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →