1

通常,对话框希望通过大致对应于阅读书籍顺序的对话框,使标签导航以有序的方式进行。

当团队中的工程师将新字段添加到对话框中时,新的小部件通常无法按制表符正确的顺序插入。

任何人都可以想出一种方法来自动检测对话框中的标签导航顺序小部件吗?

4

2 回答 2

1

我假设您在谈论 QtDesigner *.ui 文件。

当 ui 文件(实际上是 xml 文件)中GridLayout/FormLayout项的顺序与视觉顺序(从左到右、从上到下)不同时,就会发生乱序选项卡。像这样:

  <layout class="QGridLayout" name="gridLayout">
    <item row="3" column="1">
      <widget .../>
    </item>
    <item row="1" column="0">
      <widget .../>
    </item>
    ...
  </layout>

请注意,第三行在第一行之前,这意味着在生成的代码中(以及动态加载 ui 时),第三行中的小部件将首先添加,并且将在 tab 顺序中排在第一位。

这是您可以在 ui 文件上使用的 XLST 来“修复”制表符顺序,它删除了所有手动设置的制表位并按视觉顺序排列 xml 项目。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="@*|node()">
        <!-- Copy everything -->
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="layout">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()">
                <!-- Sort layout items in the visual order -->
                <xsl:sort select="@row" data-type="number"/>
                <xsl:sort select="@column" data-type="number"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tabstops">
        <!-- Remove (i.e. do not copy) manual tab stops -->
    </xsl:template>
</xsl:stylesheet>

检测但不解决问题有点困难,因为必须考虑手动设置制表位。基本算法如下:

  • 通过遍历 xml 深度优先并在列表中收集小部件名称和相关项目的行和列(如果存在)和布局名称来构建“原始”选项卡顺序。
  • 使用手动制表位增加原始顺序,即根据<tabstops>xml 中的部分重新排列列表,一次一对(就像这样QWidget.setTabOrder做)。
  • 扫描列表并检查所有行和列是否按顺序排列(独立于每个布局名称)。
于 2010-05-14T16:49:51.123 回答
0

听起来您有一个 .ui 文件,其中包含一个 QTabWidget 和大量页面都在 .ui 文件中。我建议把事情分开一点。将每个 Tab 单独实现为小部件,这也可以在设计器中。然后,TabWidget 本身有两个选项。在设计器中创建所有选项卡并将内容提升到需要在该页面上运行的小部件类。或者让 TabWidget 完全为空,并使用适当的子小部件在代码中填充它。

于 2010-05-14T21:05:33.067 回答