Qt样式表深度解析:精准定制QSpinBox按钮布局与样式

发布时间:2026/8/26 6:16:09

Qt样式表深度解析:精准定制QSpinBox按钮布局与样式
1. 项目缘起为什么Qt按钮样式需要“手动”更改在Qt界面开发中我们经常会遇到一个看似简单实则考验开发者对Qt样式系统理解深度的问题如何精确地控制一个复杂控件内部某个子部件的样式就拿QSpinBox数值调节框来说默认情况下它的右侧是两个上下排列的小箭头按钮用于增减数值。这个默认样式在大多数场景下是够用的但一旦你的UI设计稿要求一个“左右布局”的加减按钮或者需要将按钮做得更大、更扁平、甚至替换成图标默认样式就束手无策了。很多刚接触Qt样式表QSS的朋友可能会尝试直接对QSpinBox整体写一个QSpinBox { ... }的样式然后发现只能改变边框、背景、字体等那两个小箭头按钮的样式纹丝不动。这正是因为QSpinBox是一个复合控件它由多个子部件sub-controls组成比如内部的QLineEdit编辑框、QAbstractSpinBox::up-button上按钮和QAbstractSpinBox::down-button下按钮。要改变这些子部件的样式就必须使用Qt样式表提供的子控件选择器。这个需求非常普遍尤其是在追求定制化UI的现代桌面应用、嵌入式HMI界面或者需要与品牌视觉规范严格对齐的项目中。本文将深入拆解如何通过QSS精准地修改QSpinBox的按钮样式并将其从默认的上下布局改为左右布局。更重要的是我会分享在这个过程中容易踩的坑、调试技巧以及如何将这套方法举一反三应用到其他复合控件如QComboBox、QScrollBar的样式定制上。2. 核心原理理解Qt样式表QSS的子控件与伪状态在动手写代码之前我们必须先理解Qt样式表的工作原理特别是“子控件”Sub-control和“伪状态”Pseudo-states这两个核心概念。你可以把QSS看作是Qt为控件定制的一套“CSS”但它是专门为桌面控件设计的有其独特的语法和规则。2.1 子控件Sub-controls控件内部的“零件”一个复杂的Qt控件往往不是铁板一块。例如一个QSpinBox可以拆解为以下几个主要的子控件::up-button数值增加的按钮默认在右上角。::down-button数值减少的按钮默认在右下角。::text显示数值的文本编辑区域。::drop-down(对于QComboBox)下拉箭头按钮。在QSS中我们使用双冒号(::)来指定这些子控件。语法格式为控件类型::子控件名称 { /* 样式属性 */ }例如QSpinBox::up-button就特指QSpinBox里的增加按钮。2.2 伪状态Pseudo-states控件的“状态”控件及其子控件在不同的交互下会有不同的状态比如鼠标悬停、按下、禁用等。在QSS中我们使用单冒号(:)来指定这些状态。语法格式为控件类型:状态 { /* 样式属性 */ }或者与子控件结合控件类型::子控件名称:状态 { /* 样式属性 */ }常见的伪状态有:hover鼠标悬停。:pressed鼠标按下。:disabled控件被禁用。:focus控件获得焦点。:checked用于如QCheckBox等被选中。理解了这两个概念我们就知道要改变QSpinBox按钮的样式目标选择器应该是QSpinBox::up-button和QSpinBox::down-button。而要改变它们在鼠标悬停或按下时的样式则需要加上:hover和:pressed伪状态。2.3 样式属性的继承与层叠QSS的样式应用遵循层叠规则。更具体的选择器例如指定了ID或包含了子控件和状态会覆盖更通用的选择器。同时子控件会从其父控件继承一些样式属性如字体、颜色但像background、border、width、height等盒模型属性通常需要显式指定。注意一个非常关键的实践点是对子控件设置width和height有时并不像预期那样工作。对于QSpinBox的按钮更可靠的方式是使用margin、padding和border-image或image属性来控制其大小和外观或者通过设置QSpinBox本身的min-height来间接影响按钮区域。3. 实战演练将QSpinBox按钮从上下改为左右样式理论铺垫完毕现在进入实战环节。我们的目标是将一个标准的上下按钮QSpinBox改造为左右按钮样式并为其定制一套扁平化的视觉风格。3.1 基础布局改造核心QSS代码首先我们通过QSS交换上下按钮的位置并调整编辑框的布局使其看起来是左右按钮。核心思路是将::up-button增加按钮放在左侧。将::down-button减少按钮放在右侧。调整编辑框::text的位置和边距使其位于中间。以下是一段可以实现基础左右布局的QSS代码/* 针对所有QSpinBox的基础样式 */ QSpinBox { border: 2px solid #cccccc; border-radius: 6px; background-color: white; padding: 2px; /* 控件内边距 */ min-height: 30px; /* 确保控件有足够高度 */ /* 设置字体等 */ font-family: Microsoft YaHei; font-size: 14px; } /* 编辑框区域占据中间主要空间清除默认边框 */ QSpinBox::text { border: none; /* 去掉编辑框自身的边框 */ background-color: transparent; /* 背景透明显示QSpinBox的背景 */ padding-left: 25px; /* 为左侧按钮留出空间 */ padding-right: 25px; /* 为右侧按钮留出空间 */ text-align: center; /* 文本居中 */ } /* 增加按钮原up-button放在左侧 */ QSpinBox::up-button { subcontrol-origin: border; /* 子控件定位相对于边框矩形 */ subcontrol-position: left center; /* 定位在左侧垂直居中 */ width: 24px; /* 按钮宽度 */ height: 24px; /* 按钮高度 */ border: none; border-right: 1px solid #ddd; /* 与编辑区域添加一个分隔线 */ background-color: #f0f0f0; border-radius: 6px 0 0 6px; /* 左侧圆角 */ } /* 减少按钮原down-button放在右侧 */ QSpinBox::down-button { subcontrol-origin: border; subcontrol-position: right center; /* 定位在右侧垂直居中 */ width: 24px; height: 24px; border: none; border-left: 1px solid #ddd; /* 与编辑区域添加一个分隔线 */ background-color: #f0f0f0; border-radius: 0 6px 6px 0; /* 右侧圆角 */ } /* 按钮悬停状态 */ QSpinBox::up-button:hover, QSpinBox::down-button:hover { background-color: #e0e0e0; } /* 按钮按下状态 */ QSpinBox::up-button:pressed, QSpinBox::down-button:pressed { background-color: #d0d0d0; }代码关键点解析subcontrol-origin和subcontrol-position这是实现精确定位的关键属性。subcontrol-origin: border;意味着子控件按钮的定位参考系是父控件QSpinBox的边框矩形border rectangle。subcontrol-position: left center;则将按钮的中心点对齐到参考系的左侧中间位置。通过这两个属性的组合我们实现了按钮的左右布局。QSpinBox::text的padding为了让编辑框的文本不覆盖到左右按钮的区域我们必须为编辑框设置左右内边距padding-left/right其值应至少等于按钮的宽度。按钮高度与控件高度这里设置按钮的height: 24px;同时QSpinBox设置了min-height: 30px;。这是一个经验值确保按钮在垂直方向上有足够的空间且与控件边框有一定间隔。在实际项目中你可能需要根据UI设计稿微调这些值。3.2 进阶美化使用图像Image和边框图像Border-image纯色背景的按钮可能不够美观。我们可以使用image或border-image属性来为按钮设置图标。方案一使用image属性适合固定大小的图标QSpinBox::up-button { subcontrol-origin: border; subcontrol-position: left center; width: 24px; height: 24px; border: none; image: url(:/icons/add_left.png); /* 使用Qt资源系统中的图标 */ background-color: transparent; /* 背景设为透明只显示图标 */ } QSpinBox::up-button:hover { image: url(:/icons/add_left_hover.png); /* 悬停时切换图标 */ }这种方式简单直接但需要准备不同状态下的多套图标且图标会拉伸填充整个width和height定义的区域。方案二使用border-image属性适合可拉伸的按钮背景border-image非常强大它可以将一张图片分割为九宫格四个角不变形四条边和中间区域进行拉伸或平铺非常适合制作自适应大小的精美按钮。QSpinBox::up-button { subcontrol-origin: border; subcontrol-position: left center; width: 24px; height: 24px; border: none; border-image: url(:/images/btn_bg_normal.png) 4 4 4 4 stretch stretch; /* 参数含义图片路径上、右、下、左的边框切割宽度水平拉伸方式垂直拉伸方式 */ } QSpinBox::up-button:pressed { border-image: url(:/images/btn_bg_pressed.png) 4 4 4 4 stretch stretch; }使用border-image时你需要精心设计切图并正确设置四个边的切割宽度对应图片中不被拉伸的边框部分。实操心得在团队协作中border-image的切图规范需要前端/UI设计师和开发人员密切沟通。明确切割宽度并确保不同状态的图片尺寸完全一致否则在切换状态时会出现视觉抖动。对于简单的项目使用image属性配合background-color渐变可能是更快捷的选择。3.3 应用样式表三种常用方法写好QSS后如何应用到控件上主要有三种方式在代码中直接设置适用于单个控件或动态样式// C 示例 ui-spinBox-setStyleSheet(QSpinBox { border: 1px solid gray; } ...);# PyQt/PySide 示例 self.spinBox.setStyleSheet(QSpinBox { border: 1px solid gray; } ...)使用Qt Designer的样式表编辑器可视化设计 在Qt Designer中选中控件在属性编辑器中找到styleSheet一项点击旁边的“...”按钮会弹出样式表编辑器。你可以直接在里面编写和预览QSS。这种方式非常适合原型设计和快速调整。加载外部QSS文件便于管理和维护 这是中大型项目推荐的做法。将QSS写在一个独立的.qss文件中然后在程序启动时加载。// C 示例 QFile file(:/style/style.qss); // 从资源文件加载 file.open(QFile::ReadOnly); QString styleSheet QLatin1String(file.readAll()); qApp-setStyleSheet(styleSheet); // 应用到整个应用程序 file.close();这样做的好处是样式与逻辑分离非开发人员如UI设计师也可以方便地修改样式文件而无需重新编译代码。4. 深度排坑样式不生效的常见原因与调试技巧即使按照上述步骤操作你的样式也可能没有按预期显示。别慌这是Qt样式表调试的常态。下面是我总结的几个最常见的原因和排查方法。4.1 选择器特异性Specificity冲突QSS遵循类似CSS的层叠规则。更具体的选择器会覆盖更通用的选择器。例如/* 通用样式 */ QSpinBox { background: white; } /* 更具体的样式通过对象名 */ #mySpecialSpinBox { background: blue; } /* 带有状态的具体样式 */ #mySpecialSpinBox:disabled { background: gray; }如果你的样式被覆盖了检查一下是否在其他地方为同一个控件或其父控件设置了更具体的样式。一个非常隐蔽的坑是在Qt Designer中直接为控件设置的样式其选择器会自动包含控件的对象名这使得它的特异性非常高容易覆盖代码中设置的通用样式。调试技巧临时使用!important规则来强制应用样式这可以帮助你确认是否是特异性问题。QSpinBox::up-button { background-color: red !important; }如果加了!important后样式生效了那就说明存在其他更高特异性的规则在覆盖它。请谨慎使用!important它不利于后期维护仅作为调试手段。4.2 盒模型Box Model计算导致的布局错乱这是左右布局样式中最容易出问题的地方。QSpinBox的整体宽度由width、border、padding和内部子部件的尺寸共同决定。如果你为QSpinBox设置了固定的width同时又为按钮和编辑框设置了较大的width和padding很可能导致内容溢出或布局挤压。解决方案优先使用min-width和min-height代替固定的width/height让控件可以自适应内容。仔细计算padding和子控件width确保QSpinBox::text的padding-left padding-right约等于QSpinBox::up-button的widthQSpinBox::down-button的width。可以留出1-2像素的余量。使用box-sizing属性Qt的样式表部分支持CSS的box-sizing属性。设置QSpinBox { box-sizing: border-box; }可以让控件的width和height包含border和padding这有时能使尺寸计算更符合直觉但请注意其兼容性。4.3 子控件默认样式残留有些子控件特别是按钮有内置的默认样式比如凸起的边框、渐变背景。仅仅设置background-color可能无法完全覆盖它们。你需要显式地重置这些属性。QSpinBox::up-button { border: none; /* 重置边框 */ background: none; /* 重置背景 */ background-color: #f0f0f0; /* 然后设置新背景色 */ /* 或者使用 background: qlineargradient(...); 直接设置渐变 */ }4.4 使用Qt Style Sheet Reference和调试工具Qt官方文档中的 Qt Style Sheets Reference 是必备手册里面列出了所有支持样式表的控件、它们的子控件列表以及可用的伪状态。对于更复杂的调试可以启用Qt的样式表调试信息。在程序启动参数中加入-stylesheet并指向你的QSS文件或者在代码中设置后观察应用程序输出窗口。有时Qt会输出样式表解析的警告信息。此外一些第三方工具如GammaRay可以动态查看和修改运行中Qt应用的样式表是高级调试的利器。5. 举一反三将方法应用到其他复合控件掌握了QSpinBox的样式定制方法你就拥有了定制几乎所有Qt复合控件样式的钥匙。其核心方法论是识别目标子控件 - 使用正确的子控件选择器 - 结合伪状态 - 注意盒模型与布局。让我们看两个其他常见控件的例子5.1 定制QComboBox的下拉箭头和下拉列表QComboBox下拉框也是一个典型的复合控件。QComboBox::drop-down右侧的下拉箭头按钮。QComboBox::down-arrow下拉箭头按钮上的图标。QComboBox QAbstractItemView这是下拉列表的视图部分需要单独设置样式。/* 改变下拉箭头按钮的样式 */ QComboBox::drop-down { border: none; width: 30px; background-color: lightblue; } /* 改变下拉箭头图标 */ QComboBox::down-arrow { image: url(:/icons/arrow_down.png); width: 16px; height: 16px; } /* 改变下拉列表的样式 */ QComboBox QAbstractItemView { border: 2px solid darkgray; background-color: white; selection-background-color: lightblue; /* 选中项背景色 */ }注意QComboBox的下拉列表是一个独立的弹出窗口QPopupMenu或QListView其样式需要通过QComboBox QAbstractItemView这样的后代选择器来设置。5.2 定制QScrollBar的滑块和箭头QScrollBar滚动条的子控件非常多定制起来也更复杂但原理相通。QScrollBar::handle可拖动的滑块。QScrollBar::add-line/QScrollBar::sub-line增加/减少按钮两端的箭头。QScrollBar::add-page/QScrollBar::sub-page滑块两边的区域。/* 水平滚动条 */ QScrollBar:horizontal { border: none; background: #f0f0f0; height: 12px; margin: 0px; } QScrollBar::handle:horizontal { background: #c0c0c0; min-width: 30px; /* 滑块最小宽度 */ border-radius: 6px; } QScrollBar::handle:horizontal:hover { background: #a0a0a0; } /* 隐藏两端的箭头按钮 */ QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { border: none; background: none; width: 0px; height: 0px; }通过这两个例子你可以看到只要在Qt官方文档中找到对应控件的子控件列表就能用同样的思路进行深度定制。这极大地解放了Qt界面设计的自由度让你不再受限于默认主题。6. 性能考量与最佳实践虽然QSS功能强大但滥用也会带来性能问题尤其是在界面复杂、控件数量多的情况下。避免全局通配符和过于通用的选择器* { ... }或QWidget { ... }这样的规则会影响应用程序中的每一个控件导致样式计算和重绘开销巨大。尽量使用具体的控件类型选择器或者通过设置objectName来使用ID选择器#objectName。谨慎使用border-image和渐变border-image和qlineargradient等高级背景效果比纯色background-color消耗更多资源。在嵌入式设备或对性能要求极高的场景下需要评估其影响。样式表作用域最小化不要动不动就qApp-setStyleSheet设置全局样式。优先考虑对单个控件或顶层窗口设置样式。将样式表设置在最靠近目标控件的父控件上可以减少样式重新计算的范围。考虑使用QPalette和自定义QStyle对于极其复杂的定制需求例如完全重绘一个控件的行为和外观或者对性能有极致要求时QSS可能不是最佳选择。Qt更底层的QPalette调色板和自定义QStyle是更强大、性能更好的方案但它们的开发复杂度也高得多。QSS可以解决80%的UI美化问题而QStyle用于解决剩下的20%的硬骨头。做好样式管理对于大型项目将QSS按模块或功能拆分到不同的文件中并通过变量在Qt中可以通过字符串替换或简单的预处理来实现来管理颜色、字体等主题变量可以极大地提升样式的可维护性。回到我们最初的QSpinBox左右按钮样式经过这一番从原理到实战从排坑到拓展的梳理相信你已经不仅掌握了如何实现这个具体效果更建立起了一套应对Qt界面样式定制问题的通用方法论。记住耐心调试、查阅文档、理解原理是搞定Qt样式表的不二法门。下次当你的设计师再提出一个“特别”的控件样式需求时你大可以自信地告诉他“没问题用QSS可以搞定。”

相关新闻

SpringBoot多数据源配置实战:从手动配置到dynamic-datasource

SpringBoot多数据源配置实战:从手动配置到dynamic-datasource

2026/8/26 6:16:09

1. 项目背景与核心诉求在真实的业务开发中,一个SpringBoot应用只连接一个数据库的场景,往往只存在于教科书或者最简单的Demo里。随着业务模块的拆分、历史系统的整合,或者读写分离、分库分表等架构演进,一个服务需要同时与多个数据…

Transformer架构详解:从自注意力机制到BERT/GPT核心原理

Transformer架构详解:从自注意力机制到BERT/GPT核心原理

2026/8/26 6:16:09

1. 从“Attention is All You Need”说起:为什么Transformer是革命性的?2017年,一篇名为《Attention Is All You Need》的论文横空出世,它提出的Transformer架构,彻底改变了自然语言处理乃至整个深度学习领域的游戏规则…

基于Humanizer-zh的AI文本降AI味改写实践与工程接入指南

基于Humanizer-zh的AI文本降AI味改写实践与工程接入指南

2026/8/26 6:16:09

如果你最近在写技术博客、公众号文案或者产品文档,一定碰到过这种尴尬:用 AI 写完初稿,自己读一遍,总觉得哪里不对——字都对,句子也通顺,但读起来就是“很 AI”。在中文内容圈,把“很 AI”改成…

2026年AI开发工作流实战指南:从IDE选型到自动化部署

2026年AI开发工作流实战指南:从IDE选型到自动化部署

2026/8/26 7:06:11

1. 从“玩具”到“生产力”:为什么你的AI工作流需要一次系统性升级如果你是一名开发者,现在打开你的电脑,数一数你正在使用或曾经尝试过的AI工具。是ChatGPT的网页标签页?是Cursor的编辑器窗口?还是某个本地运行的Olla…

基于YOLOv5的手部X光骨骼检测:从数据工程到模型部署实战

基于YOLOv5的手部X光骨骼检测:从数据工程到模型部署实战

2026/8/26 7:06:11

1. 项目缘起:从一张X光片说起作为一名长期混迹于计算机视觉和医疗影像交叉领域的技术人,我经常被问到:“你们搞AI的,到底能不能帮医生看片子?” 这个问题背后,是临床医生每天面对海量影像数据时&#xff0c…

电子罗盘倾斜补偿算法:从原理到嵌入式实现的实战指南

电子罗盘倾斜补偿算法:从原理到嵌入式实现的实战指南

2026/8/26 7:06:11

1. 项目概述:从指南针到智能感知的核心电子罗盘,或者说数字罗盘,早已不是我们印象中那个躺在历史课本里的司南了。它是一套集成了磁传感器、加速度计,有时还有陀螺仪的微型系统,核心任务就是告诉你“哪边是北”。听起来…

TRACES基准:让AI研究过程可审计、可复现的评估框架

TRACES基准:让AI研究过程可审计、可复现的评估框架

2026/8/26 7:06:11

TRACES 基准的核心目标,是把“AI 探索性研究过程”从黑盒变成可审计的过程数据。传统评测往往只关心最终答案正确与否,但在研究型任务中,同一个结论可以由质量完全不同的过程产生:有的经过多轮检索、交叉验证和反例排除&#xff0…

AI求职社群的价值与运营模式解析

AI求职社群的价值与运营模式解析

2026/8/26 7:06:11

1. 项目背景与核心价值最近在技术社区看到一个很有意思的社群招募——"最大的AI求职群来了!"。作为一个在AI行业摸爬滚打多年的从业者,我深知这个领域的求职痛点。AI岗位的特殊性在于,它既要求扎实的算法基础,又需要丰富…

音频DSP开发实战:定点与浮点数选型、优化及SHARC混合精度设计

音频DSP开发实战:定点与浮点数选型、优化及SHARC混合精度设计

2026/8/26 6:56:10

1. 项目概述:从音频DSP的视角看数字的“肉身”干了这么多年音频DSP开发,从ADI的SHARC到TI的C6000系列,踩过的坑、调过的参数,数都数不过来。但回过头看,很多让人头疼的问题——比如算法跑着跑着就溢出爆音了&#xff0…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…