QtCreator:将 QtCreatorCodeStyle 与 clang-format 统一起来

Posted

技术标签:

【中文标题】QtCreator:将 QtCreatorCodeStyle 与 clang-format 统一起来【英文标题】:QtCreator: unify QtCreatorCodeStyle with clang-format 【发布时间】:2017-03-09 11:46:56 【问题描述】:

我想知道是否有一种简单的方法可以将qt creator codestyle(xml文件)转换为clang-format文件?

我的 c++ 代码有以下配置,从 qtcreator 生成:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorCodeStyle>
<!-- Written by QtCreator 4.2.1, 2017-03-09T12:29:05. -->
<qtcreator>
 <data>
  <variable>CodeStyleData</variable>
  <valuemap type="QVariantMap">
   <value type="bool" key="AlignAssignments">false</value>
   <value type="bool" key="AutoSpacesForTabs">false</value>
   <value type="bool" key="BindStarToIdentifier">false</value>
   <value type="bool" key="BindStarToLeftSpecifier">true</value>
   <value type="bool" key="BindStarToRightSpecifier">false</value>
   <value type="bool" key="BindStarToTypeName">true</value>
   <value type="bool" key="ExtraPaddingForConditionsIfConfusingAlign">true</value>
   <value type="bool" key="IndentAccessSpecifiers">false</value>
   <value type="bool" key="IndentBlockBody">true</value>
   <value type="bool" key="IndentBlockBraces">false</value>
   <value type="bool" key="IndentBlocksRelativeToSwitchLabels">true</value>
   <value type="bool" key="IndentClassBraces">false</value>
   <value type="bool" key="IndentControlFlowRelativeToSwitchLabels">true</value>
   <value type="bool" key="IndentDeclarationsRelativeToAccessSpecifiers">true</value>
   <value type="bool" key="IndentEnumBraces">false</value>
   <value type="bool" key="IndentFunctionBody">true</value>
   <value type="bool" key="IndentFunctionBraces">false</value>
   <value type="bool" key="IndentNamespaceBody">false</value>
   <value type="bool" key="IndentNamespaceBraces">false</value>
   <value type="int" key="IndentSize">2</value>
   <value type="bool" key="IndentStatementsRelativeToSwitchLabels">true</value>
   <value type="bool" key="IndentSwitchLabels">true</value>
   <value type="int" key="PaddingMode">2</value>
   <value type="bool" key="ShortGetterName">true</value>
   <value type="bool" key="SpacesForTabs">false</value>
   <value type="int" key="TabSize">2</value>
  </valuemap>
 </data>
 <data>
  <variable>DisplayName</variable>
  <value type="QString">Google</value>
 </data>
</qtcreator>

但我找不到大多数这些变量的 clang 格式等效项。 我在美化器插件中的 clang 格式文件相似但不完全相同,这导致我的 git diff 每次都很混乱。

【问题讨论】:

【参考方案1】:

我浏览了 QtCreator 设置并提出了以下一般映射。这些设置按照它们在Qt Creator 4.10.2代码样式对话框中出现的顺序列出,这有助于识别有时神秘的名称。

标记为 N/A 的设置是 clang-format 似乎不支持的东西。 (根据文档clang-format 有意仅支持一小组固定样式,而不是通用格式化程序。)

我没有尝试匹配特定的设置值或更复杂的组合,但这个列表应该作为找出它的起点。

QtCreator                                     Clang-format
---------                                     ------------

[GENERAL]
SpacesForTabs                                 UseTab
TabSize                                       TabWidth
IndentSize                                    IndentWidth
PaddingMode                                   UseTab

[CONTENT]
IndentAccessSpecifiers                        AccessModifierOffset
IndentDeclarationsRelativeToAccessSpecifiers  N/A
IndentFunctionBody                            N/A
IndentBlockBody                               N/A
IndentNamespaceBody                           NamespaceIndentation

[BRACES]
# Qt's implied style matches Clang BreakBeforeBraces=Allman
# Qt's IndentX options match Clang's BreakBeforeBraces=GNU
# to customize GNU style, see:
IndentClassBraces       BraceWrapping:AfterClass:IndentBraces
IndentNamespaceBraces   BraceWrapping:AfterNamespace:IndentBraces
IndentEnumBraces        BraceWrapping:AfterEnum:IndentBraces
IndentFunctionBraces    BraceWrapping:AfterFunction:IndentBraces
IndentBlockBraces       N/A

[SWITCH]
IndentSwitchLabels                            IndentCaseLabels
IndentStatementsRelativeToSwitchLabels        N/A
IndentBlocksRelativeToSwitchLabels            N/A
IndentControlFlowRelativeToSwitchLabels       N/A

[ALIGNMENT]
AlignAssignments                              AlignOperands
ExtraPaddingForConditionsIfConfusingAlign     N/A

[POINTERS AND REFERENCES]
BindStarToIdentifier                          PointerAlignment
BindStarToTypeName                            PointerAlignment
BindStarToLeftSpecifier                       PointerAlignment
BindStarToRightSpecifier                      PointerAlignment

[?]
AutoSpacesForTabs                             N/A (editor setting)

【讨论】:

【参考方案2】:

您可以从已安装的格式中获取示例配置,例如llvm:

clang-format -style=llvm -dump-config > .clang-format

所以你需要“value”元素的文本和key属性。 格式主要是。 :

使用 python 和 lxml:

with open(xml_path) as xml_file: 
xml_content = xml_file.read()
tree = etree.parse(xml_path)
elements = tree.findall("value")
fileBuffer =""
for e in elements:
    filebuffer += e.attr["key"] + ": " + e.text + "\n"

未测试

【讨论】:

以上是关于QtCreator:将 QtCreatorCodeStyle 与 clang-format 统一起来的主要内容,如果未能解决你的问题,请参考以下文章

QtCreator:将 QtCreatorCodeStyle 与 clang-format 统一起来

如何将QtCreator项目转换为Visual Studio项目

将 QtCreator 2.7.0 与 OpenCV 2.4.5 一起使用

将 QtCreator 中的 Qt 对象放入 Python 列表中

将 grpc 与 QtCreator 一起使用,未定义对 `grpc::...` 的引用

如何将 QT MCU 项目调试到 QTcreator 和 IMXRT1052 评估板?