有时,在使用QT时,在生成的ui文件xml格式中,行的顺序不受尊重(row="11“出现在row=”0“之前)。
我知道在功能上它对编译的代码没有任何影响。我对这种行为有两种担忧:
( a)“小修改”产生的差异很大,这降低了我审查公共关系的能力,增加了疏忽的可能性。
( b)我有时从终端以文本模式编辑ui文件。对行进行排序是可取的。
对我来说更重要的是。
这个按下就是一个例子,它涉及三行的删除。
由于外部链接可能会被删除,我在这里包括一个相关的摘录,显示了这个问题:
<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">在某些情况下,即使是同一行()的第二列也出现在源中第一列()之后。
我确实理解,从功能的角度来看,顺序并不重要,并且不需要对行和cols进行排序。
我的问题是:是否有任何合理的方法(例如,Qt设计器的选项或插件,或者用于重新格式化ui文件的工具),以便在ui文件中对列进行排序,从而导致合理地检查差异?
提前谢谢你抽出时间,阿卜杜拉
发布于 2021-01-18 16:49:20
这个python脚本将按行列顺序对Qt文件中任何QGridLayout部件的子项进行排序。
#!/usr/bin/env python
# encoding: utf-8
from __future__ import print_function
import logging
from lxml import etree
# Inspired from here: https://stackoverflow.com/a/46128043
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)https://stackoverflow.com/questions/65463217
复制相似问题