如何在 Qt 对话框中自动检测乱序选项卡导航?
Posted
技术标签:
【中文标题】如何在 Qt 对话框中自动检测乱序选项卡导航?【英文标题】:How to automate detection of out of order tab navigation in Qt dialogs? 【发布时间】:2010-05-12 22:54:22 【问题描述】:通常,一个对话框希望标签导航通过一个大致对应于阅读一本书的顺序的对话框以有序的方式进行。
当团队中的工程师将新字段添加到对话框中时,新的小部件通常无法以正确的选项卡顺序插入。
任何人都可以想出一种方法来自动检测对话框中的标签导航顺序小部件吗?
【问题讨论】:
【参考方案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 并在列表中收集小部件名称和关联项目的行和列(如果存在)和布局名称来构建“原始”选项卡顺序。 使用手动制表位增加原始顺序,即根据 xml 中的<tabstops>
部分重新排列列表,一次一对(就像 QWidget.setTabOrder
那样)。
扫描列表并检查所有行和列是否按顺序排列(独立于每个布局名称)。
【讨论】:
【参考方案2】:听起来您有一个带有 QTabWidget 的 .ui 文件和大量页面都在 .ui 文件中。我建议把事情分开一点。将每个 Tab 单独实现为小部件,这也可以在设计器中。然后,TabWidget 本身有两个选项。在设计器中创建所有选项卡并将内容提升到需要在该页面上运行的小部件类。或者让 TabWidget 完全为空,并使用适当的子小部件在代码中填充它。
【讨论】:
以上是关于如何在 Qt 对话框中自动检测乱序选项卡导航?的主要内容,如果未能解决你的问题,请参考以下文章