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>

3番目の行は最初の行の前にあることに注意してください。つまり、生成されたコードでは(UIを動的にロードする場合も)、3番目の行のウィジェットが最初に追加され、タブ順で最初に表示されます。

これは、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のセクションに従ってリストを一度に1ペアずつ再配置します(そうするようQWidget.setTabOrderに)。
  • リストをスキャンして、すべての行と列が順番に並んでいることを確認します(レイアウト名ごとに独立しています)。
于 2010-05-14T16:49:51.123 に答える
0

QTabWidgetを含む.uiファイルと多数のページがすべて.uiファイルにあるようです。もう少し分割することをお勧めします。各タブをそれ自体でウィジェットとして実装します。これはデザイナーにも含めることができます。次に、TabWidget自体に2つのオプションがあります。デザイナですべてのタブを作成し、そのページに移動する必要のあるウィジェットクラスにコンテンツをプロモートします。または、TabWidgetを完全に空のままにして、適切なサブウィジェットをコードに入力します。

于 2010-05-14T21:05:33.067 に答える