Qt ui 文件 - xml 顺序 - QGridLayout 行顺序导致较大的提交差异

Qt ui file - xml order - QGridLayout row order leads to large commit differences

有时在使用 QT Designer 时,在生成的 ui 文件 xml 格式中,不遵守行的顺序(行 =“11” 出现在行 = 0 之前) .

我知道在功能上它对编译代码的影响为零。我对这种行为有两个担忧:

a) “小修改”产生的差异很大,这降低了我审查 PR 的能力并增加了疏忽的可能性。

b) 我有时会从终端以文本模式编辑 ui 文件。对行进行排序是可取的。

关注 a) 对我来说更为重要。

示例是这个 PR,它涉及删除三行。

因为外部 link 可能会被删除,这里我包含一个相关的摘录来显示这个问题:

        <layout class="QGridLayout" name="gridLayout_2">
-        <item row="0" column="0">
-         <widget class="QLabel" name="label_17">
+        <item row="11" column="0">
+         <widget class="QLabel" name="label_43">
           <property name="minimumSize">
            <size>
             <width>182</width>
@@ -31,27 +31,7 @@
            </size>
           </property>
           <property name="text">
-           <string>Default edge color</string>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="1">
-         <widget class="Gui::PrefColorButton" name="SketchEdgeColor">
-          <property name="toolTip">
-           <string>Color of edges</string>
-          </property>
-          <property name="color">
-           <color>
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </property>
-          <property name="prefEntry" stdset="0">
-           <cstring>SketchEdgeColor</cstring>
-          </property>
-          <property name="prefPath" stdset="0">
-           <cstring>View</cstring>
+           <string>Fully constrained edit internal alignment edge color</string>
           </property>
          </widget>
         </item>
@@ -68,61 +48,28 @@
           </property>
          </widget>
         </item>
-        <item row="1" column="1">
-         <widget class="Gui::PrefColorButton" name="SketchVertexColor">
-          <property name="toolTip">
-           <string>Color of vertices</string>
-          </property>
-          <property name="color">
-           <color>
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </property>
-          <property name="prefEntry" stdset="0">
-           <cstring>SketchVertexColor</cstring>
-          </property>
-          <property name="prefPath" stdset="0">
-           <cstring>View</cstring>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="0">
-         <widget class="QLabel" name="label_6">
-          <property name="minimumSize">
-           <size>
-            <width>182</width>
-            <height>0</height>
-           </size>
-          </property>
-          <property name="text">
-           <string>Making line color</string>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="1">
-         <widget class="Gui::PrefColorButton" name="CreateLineColor">
+        <item row="6" column="1">
+         <widget class="Gui::PrefColorButton" name="InternalAlignedGeoColor">
           <property name="toolTip">
-           <string>Color used while new sketch elements are created</string>
+           <string>Color of edges of internal alignment geometry</string>
           </property>
           <property name="color">
            <color>
-            <red>204</red>
-            <green>204</green>
-            <blue>204</blue>
+            <red>178</red>
+            <green>178</green>
+            <blue>127</blue>
            </color>
           </property>
           <property name="prefEntry" stdset="0">
-           <cstring>CreateLineColor</cstring>
+           <cstring>InternalAlignedGeoColor</cstring>
           </property>
           <property name="prefPath" stdset="0">
            <cstring>View</cstring>
           </property>
          </widget>
         </item>
-        <item row="3" column="0">
-         <widget class="QLabel" name="label">

在某些情况下,源代码中同一行的第二列 () 甚至出现在第一列 () 之后。

我明白从功能的角度来看顺序并不重要,并且没有功能要求ui说明行和列已排序。

我的问题是:是否有任何合理的方法(例如 Qt Designer 的选项或插件,或替代方法,或重新格式化 ui 的工具文件)以便列在 ui 文件中排序,从而导致合理的审查差异?

提前感谢您的宝贵时间, 阿卜杜拉

此 python 脚本将按行列顺序对 Qt UI 文件中任何 QGridLayout 小部件的子项进行排序。

#!/usr/bin/env python
# encoding: utf-8

from __future__ import print_function

import logging
from lxml import etree


# Inspired from here: 


def sort_children(node, klass, key):
    """ Sort children along tag and given attribute.
    if attr is None, sort along all attributes"""
    if not isinstance(node.tag, str):  # PYTHON 2: use basestring instead
        # not a TAG, it is comment or DATA
        # no need to sort
        return


    if node.get('class') == klass:
        # sort child along attr
        node[:] = sorted(node, key=key)
    else:
        # and recurse
        for child in node:
            sort_children(child, klass, key)


def sort(unsorted_file, sorted_file, klass, key):
    """Sort unsorted xml file and save to sorted_file"""
    tree = etree.parse(unsorted_file)
    root = tree.getroot()
    sort_children(root, klass, key)

    sorted_unicode = etree.tostring(root,
                                    pretty_print=True,
                                    encoding='unicode')
    with open(sorted_file, 'w') as output_fp:
        output_fp.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        output_fp.write('%s' % sorted_unicode)
        logging.info('written sorted file %s', sorted_unicode)


filename = "Path_to_unsorted_QML_file.ui"
filename_out = "Path_to_sorted_QML_file.ui"

def row_col_key(node):
    """Return the sorting key of an xml node"""
    row = node.get('row') if node.get('row') else -1
    col = node.get('column') if node.get('column') else -1

    return '{:04d}{:04d}'.format(int(row), int(col))


sort(filename, filename_out, "QGridLayout", row_col_key)