在PySide6/PyQt6的项目中实现样式切换处理
<p data-start="227" data-end="323">在桌面应用开发中,“主题切换(深色 / 浅色模式)”已经不再是锦上添花的功能,而是逐渐成为一种用户刚需。尤其对于长时间使用的 ERP 工具类应用来说,良好的视觉舒适度对用户体验影响巨大。本篇随笔针对PySide6/PyQt6的项目的实现案例,介绍如何实现样式切换处理。</p><p data-start="325" data-end="355">Qt 官方本身提供了 <code data-start="336" data-end="344">QStyle</code> 体系,但如果想做到:</p>
<ul data-start="357" data-end="403">
<li data-start="357" data-end="365">
<p data-start="359" data-end="365">可自定义配色</p>
</li>
<li data-start="366" data-end="375">
<p data-start="368" data-end="375">可作为品牌皮肤</p>
</li>
<li data-start="376" data-end="388">
<p data-start="378" data-end="388">可热切换(无需重启)</p>
</li>
<li data-start="389" data-end="396">
<p data-start="391" data-end="396">多主题共存</p>
</li>
<li data-start="397" data-end="403">
<p data-start="399" data-end="403">可持久化</p>
</li>
</ul>
<p data-start="405" data-end="470">那么,<strong data-start="408" data-end="470">采用 QSS (Qt Style Sheet) + 统一主题管理器的方案无疑是目前最成熟、最实用、性价比最高的选择。</strong></p>
<p data-start="472" data-end="553">本文将从 <strong data-start="477" data-end="504">原理 → 架构设计 → 实现方式 → 最佳实践</strong> 四个维度,完整介绍在 PySide6 / PyQt6 项目中如何构建一套“企业级主题切换系统”。</p>
<h3 data-start="565" data-end="590">一、为什么不能简单地用 <code data-start="579" data-end="589">setStyle</code>?</h3>
<p data-start="592" data-end="614">很多初学者在做样式适配时,都会走入一个误区:</p>
<div class="cnblogs_code">
<pre>btn.setStyleSheet(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">background:red</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
table.setStyleSheet(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">color:white</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
...</span></pre>
</div>
<p data-start="706" data-end="729">这种写法短期“能用”,长期会带来三个严重问题:</p>
<p data-start="731" data-end="746">1. 样式分散,难维护</p>
<p data-start="748" data-end="790">不同窗口、不同控件中的样式写法彼此独立,一个主题改动需要满项目搜索替换,很容易遗漏。</p>
<hr data-start="792" data-end="795">
<p data-start="797" data-end="811">2. 逻辑和表现混杂</p>
<p data-start="813" data-end="850">UI 逻辑代码被大量 CSS 淹没,维护成本剧增,违反基本的架构解耦原则。</p>
<hr data-start="852" data-end="855">
<p data-start="857" data-end="872">3. 无法进行主题切换</p>
<p data-start="874" data-end="918">没有分主题文件结构,一旦需要切换风格就必须“重写所有 setStyle”,几乎不可实现。</p>
<hr data-start="920" data-end="923">
<p data-start="925" data-end="985">✅ 因此,<strong data-start="930" data-end="985">如果项目规模超过 3 个界面,我们就必须放弃零散 setStyle 写法,转而使用 QSS 主题体系。</strong></p>
<h3 data-start="1002" data-end="1014">二、什么是 QSS?</h3>
<p data-start="1016" data-end="1083">Qt 中的 <strong data-start="1022" data-end="1046">QSS (Qt Style Sheet)</strong> 本质和 CSS 非常类似,几乎可以视为 CSS 在 Qt 世界中的实现。</p>
<p data-start="1085" data-end="1095">对 Qt 控件来说:</p>
<ul data-start="1097" data-end="1206">
<li data-start="1097" data-end="1118">
<p data-start="1099" data-end="1118"><code data-start="1099" data-end="1108">QWidget</code> → HTML 标签</p>
</li>
<li data-start="1119" data-end="1157">
<p data-start="1121" data-end="1157"><code data-start="1121" data-end="1134">QPushButton</code>、<code data-start="1135" data-end="1147">QTableView</code> → CSS 选择器</p>
</li>
<li data-start="1158" data-end="1206">
<p data-start="1160" data-end="1206"><code data-start="1160" data-end="1199">background / border / padding / color</code> → 样式属性</p>
</li>
</ul>
<p data-start="1208" data-end="1211">例如:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">QPushButton {
background: </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">3a3a3a;</span>
border-<span style="color: rgba(0, 0, 0, 1)">radius: 6px;
color: white;
}</span></pre>
</div>
<p data-start="1308" data-end="1316">QSS 能做到:</p>
<ul data-start="1318" data-end="1354">
<li data-start="1318" data-end="1324">
<p data-start="1320" data-end="1324">全局覆盖</p>
</li>
<li data-start="1325" data-end="1336">
<p data-start="1327" data-end="1336">继承 & 层级作用</p>
</li>
<li data-start="1337" data-end="1345">
<p data-start="1339" data-end="1345">精准控件控制</p>
</li>
<li data-start="1346" data-end="1354">
<p data-start="1348" data-end="1354">即时加载刷新</p>
</li>
</ul>
<p data-start="1397" data-end="1404">我们希望做到:</p>
<blockquote data-start="1406" data-end="1445">
<p data-start="1408" data-end="1445"><strong data-start="1408" data-end="1425">业务代码永远不接触 CSS</strong><br data-start="1425" data-end="1428">
<strong data-start="1430" data-end="1445">主题由独立模块统一调度</strong></p>
</blockquote>
<div class="cnblogs_code">
<pre>project/<span style="color: rgba(0, 0, 0, 1)">
│
├── main.py
├── core</span>/<span style="color: rgba(0, 0, 0, 1)">
│ └── theme_manager.py
└── themes</span>/<span style="color: rgba(0, 0, 0, 1)">
├── light.qss
└── dark.qss</span></pre>
</div>
<p>通过 ThemeManager 将 UI 层与样式层完全隔离,可读性和可维护性大幅提升。</p>
<p data-start="472" data-end="553">我们需要一个负责三件事的主题管理器统一类:</p>
<ul data-start="1832" data-end="1869">
<li data-start="1832" data-end="1840">
<p data-start="1834" data-end="1840">读取主题文件</p>
</li>
<li data-start="1841" data-end="1857">
<p data-start="1843" data-end="1857">调用 Qt API 应用主题</p>
</li>
<li data-start="1858" data-end="1869">
<p data-start="1860" data-end="1869">记录并恢复用户选择</p>
</li>
</ul>
<p data-start="2796" data-end="2812">QSS 主题文件设计示例:以下是一个简化版本:</p>
<p data-start="472" data-end="553">浅色主题</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">QWidget {
background: </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">ffffff;</span>
color: <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">202020;</span>
<span style="color: rgba(0, 0, 0, 1)">}
QPushButton {
background: </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">e8e8e8;</span>
border-<span style="color: rgba(0, 0, 0, 1)">radius: 4px;
}</span></pre>
</div>
<p>深色主题</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">QWidget {
background: </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">2b2b2b;</span>
color: <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">f0f0f0;</span>
<span style="color: rgba(0, 0, 0, 1)">}
QPushButton {
background: </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">3a3a3a;</span>
color: <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">ffffff;</span>
}</pre>
</div>
<h3>三、UI 中的使用方式</h3>
<p>我们通过创建系统相关的菜单,如定义样式切换的菜单,然后绑定对应的菜单信号处理。</p>
<div class="cnblogs_code">
<pre>action_dark.triggered.connect(<span style="color: rgba(0, 0, 255, 1)">lambda</span>: ThemeManager.apply(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dark</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
action_light.triggered.connect(</span><span style="color: rgba(0, 0, 255, 1)">lambda</span>: ThemeManager.apply(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">light</span><span style="color: rgba(128, 0, 0, 1)">"</span>))</pre>
</div>
<p>这样切换的时候,无需重启——Qt 会自动刷新全部控件。</p>
<p>通过样式管理器,实现不同主题演示的即时切换。</p>
<p data-start="4141" data-end="4163"><strong data-start="4141" data-end="4163">主题系统并不是简单的“换几个颜色”。</strong></p>
<p data-start="4165" data-end="4182">它是 UI 架构中不可忽视的一环:</p>
<ul data-start="4184" data-end="4213">
<li data-start="4184" data-end="4192">
<p data-start="4186" data-end="4192">影响可维护性</p>
</li>
<li data-start="4193" data-end="4202">
<p data-start="4195" data-end="4202">决定代码整洁度</p>
</li>
<li data-start="4203" data-end="4213">
<p data-start="4205" data-end="4213">直接关系用户体验</p>
</li>
</ul>
<hr data-start="4215" data-end="4218">
<p data-start="4220" data-end="4240">在 PySide6 / PyQt6 中,</p>
<blockquote data-start="4242" data-end="4279">
<p data-start="4244" data-end="4279"><strong data-start="4244" data-end="4279">QSS + ThemeManager + 动态切换 + 持久化</strong></p>
</blockquote>
<p data-start="4281" data-end="4310">这一套组合,几乎是目前最成熟可靠的主题实现方案,没有之一。</p>
<p data-start="568" data-end="582">真正的统一UI的样式,包含 5 个维度:</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" style="height: 208px; width: 756px" data-start="584" data-end="739">
<thead data-start="584" data-end="595">
<tr data-start="584" data-end="595"><th data-start="584" data-end="589" data-col-size="sm">维度</th><th data-start="589" data-end="595" data-col-size="sm">说明</th></tr>
</thead>
<tbody data-start="612" data-end="739">
<tr data-start="612" data-end="637">
<td data-start="612" data-end="619" data-col-size="sm">色板统一</td>
<td data-col-size="sm" data-start="619" data-end="637">背景色、主色、强调色、警示色</td>
</tr>
<tr data-start="638" data-end="658">
<td data-start="638" data-end="645" data-col-size="sm">字体统一</td>
<td data-col-size="sm" data-start="645" data-end="658">字体家族、字号梯度</td>
</tr>
<tr data-start="659" data-end="687">
<td data-start="659" data-end="666" data-col-size="sm">控件形态</td>
<td data-col-size="sm" data-start="666" data-end="687">圆角、border、padding</td>
</tr>
<tr data-start="688" data-end="718">
<td data-start="688" data-end="695" data-col-size="sm">交互动效</td>
<td data-col-size="sm" data-start="695" data-end="718">hover、press、disable</td>
</tr>
<tr data-start="719" data-end="739">
<td data-start="719" data-end="726" data-col-size="sm">布局密度</td>
<td data-col-size="sm" data-start="726" data-end="739">表格行距、控件间距</td>
</tr>
</tbody>
</table>
</div>
</div>
<p> </p>
<h3>四、具体在PySide6/PyQt6的项目中的实践过程</h3>
<p>我们根据前面的介绍,在项目目录中创建两个不同主题样式的文件,如下所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/8867/202512/8867-20251208115436027-1854422789.png" alt="image" width="432" height="157" loading="lazy"></p>
<p>然后根据样式的需要定义对应的相关内容,如下是浅色的主题定义,通过定义对应控件的颜色、字体、背景色等相关属性,实现统一的效果。</p>
<p><img src="https://img2024.cnblogs.com/blog/8867/202512/8867-20251208115757462-263455411.png" alt="image" width="702" height="663" loading="lazy"></p>
<p>通过辅助类,我们创建几个菜单来实现不同样式的切换。</p>
<div class="cnblogs_code">
<pre> theme_menu = menu_bar.addMenu(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">界面主题</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
light_action </span>=<span style="color: rgba(0, 0, 0, 1)"> ControlUtil.create_menu(
self, theme_menu, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">浅色主题</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
light_action.triggered.connect(</span><span style="color: rgba(0, 0, 255, 1)">lambda</span>: self.set_theme(1<span style="color: rgba(0, 0, 0, 1)">))
dark_action </span>=<span style="color: rgba(0, 0, 0, 1)"> ControlUtil.create_menu(
self, theme_menu, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">深色主题</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
dark_action.triggered.connect(</span><span style="color: rgba(0, 0, 255, 1)">lambda</span>: self.set_theme(2<span style="color: rgba(0, 0, 0, 1)">))
system_action </span>=<span style="color: rgba(0, 0, 0, 1)"> ControlUtil.create_menu(
self, theme_menu, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">初始主题</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
system_action.triggered.connect(</span><span style="color: rgba(0, 0, 255, 1)">lambda</span>: self.set_theme(0))</pre>
</div>
<p>菜单界面效果如下所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/8867/202512/8867-20251208120339959-1337629458.png" alt="image" width="1233" height="758" loading="lazy"></p>
<p>其中样式的信号处理,我们通过一个单件的样式总线对象来处理。</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> set_theme(self, theme_type):
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">设置主题颜色</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
self.theme_type </span>=<span style="color: rgba(0, 0, 0, 1)"> theme_type
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 切换主题颜色</span>
ThemeBus().set_theme_type(self.theme_type)</pre>
</div>
<p>其中,我们对样式总线对象的变化进行信号绑定处理。</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">监听主题变化的事件</span>
ThemeBus().theme_type_changed.connect(self.on_theme_changed)</pre>
</div>
<p>对主题样式的变化进行处理。</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> on_theme_changed(self, theme_type):
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">主题变化的事件处理</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
theme_map </span>=<span style="color: rgba(0, 0, 0, 1)"> {
</span>1: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">light</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span>2: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dark</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
0: </span><span style="color: rgba(128, 0, 0, 1)">""</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">不设置主题,默认使用系统主题</span>
<span style="color: rgba(0, 0, 0, 1)"> }
theme_name </span>=<span style="color: rgba(0, 0, 0, 1)"> theme_map
self.log.info(f</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">主题变化: {theme_type}:{theme_name}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 切换主题颜色</span>
ThemedHelper.apply(theme_type)</pre>
</div>
<p>这个主题的辅助类,主要就是根据当前总线的样式值,加载对应的样式文件进行设置,如果为空,这还原为最初的默认样式。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ThemedHelper:
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">控件主题辅助类</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
@staticmethod
</span><span style="color: rgba(0, 0, 255, 1)">def</span> apply(theme_type: int =<span style="color: rgba(0, 0, 0, 1)"> 0):
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">应用主题样式</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
theme_name </span>=<span style="color: rgba(128, 0, 0, 1)">""</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> theme_type == 1<span style="color: rgba(0, 0, 0, 1)">:
theme_name</span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">light</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">elif</span> theme_type == 2<span style="color: rgba(0, 0, 0, 1)">:
theme_name</span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dark</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
theme_name </span>= <span style="color: rgba(128, 0, 0, 1)">""</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span><span style="color: rgba(0, 0, 0, 1)"> theme_name:
qss </span>= <span style="color: rgba(128, 0, 0, 1)">""</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 自动主题, 无需加载 qss 文件</span>
<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:</span>
with open(f<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">app/themes/{theme_name}.qss</span><span style="color: rgba(128, 0, 0, 1)">"</span>, encoding=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">utf8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">) as f:
qss </span>=<span style="color: rgba(0, 0, 0, 1)"> f.read()
app : QApplication </span>=<span style="color: rgba(0, 0, 0, 1)"> QApplication.instance()
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> app:
app.setStyle(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Fusion</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
app.setStyleSheet(qss)</span></pre>
</div>
<p>暗色主题的效果如下所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/8867/202512/8867-20251208121252993-289368692.png" alt="image" width="1234" height="817" loading="lazy"></p>
<p> 如果不喜欢厚重的主题,我们也可以切换会原来的默认主题。</p>
<p><img src="https://img2024.cnblogs.com/blog/8867/202512/8867-20251208121409364-432293174.png" alt="image" width="1235" height="817" loading="lazy"></p>
<p>以上就是我们在定义不同主题,实现主题切换的过程,我们可以根据需要,定义更多有特色的主题样式,而具有统一效果的主题样式,我们可以通过AI的询问方式,获得完整的样式代码,从而构建个性化的效果。</p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<div style="border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 98%; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; background-color: #eeeeee;">
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt>
<span style="color: #000000"><span class="Apple-tab-span" style="white-space: pre"></span>
专注于代码生成工具、.Net/Python 框架架构及软件开发,以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架、Python开发框架等框架产品。
<br> 转载请注明出处:撰写人:伍华聪 http://www.iqidi.com <br> </span></div><br><br>
来源:https://www.cnblogs.com/wuhuacong/p/19321002
頁:
[1]