Pergunta

Normalmente, uma caixa de diálogo deseja que a navegação de guias prossiga de maneira ordenada através de uma caixa de diálogo que corresponde aproximadamente à ordem de ler um livro.

Quando novos campos são adicionados a uma caixa de diálogo dos engenheiros de uma equipe, os novos widgets geralmente não podem ser inseridos na ordem correta da TAB.

Alguém pode pensar em uma maneira de automatizar a detecção dos widgets de ordem de navegação fora da guia dentro de uma caixa de diálogo?

Foi útil?

Solução

Presumo que você esteja falando sobre os arquivos QtDesigner *.ui.

A aba de fora da ordem ocorre quando a ordem de GridLayout/FormLayout Os itens em um arquivo de interface do usuário (na verdade o arquivo XML) diferem da ordem visual (da esquerda para a direita, de cima para baixo). Assim:

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

Observe que a terceira linha vem antes da primeira, o que significa que no código gerado (e também ao carregar a interface do usuário dinamicamente) o widget da terceira linha será adicionado primeiro e virá primeiro na ordem da guia.

Aqui está o XLST que você pode usar em um arquivo de interface do usuário para "corrigir" a ordem da guia, ele remove todas as paradas de guias definidas manualmente e organiza itens XML em ordem visual.

<?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>

Detectar, mas não corrigir o problema, é um pouco mais difícil, porque as paradas de guias definidas manualmente devem ser levadas em consideração. O algoritmo básico é o seguinte:

  • Crie a ordem da guia "Raw" caminhando XML de profundidade-primeiro e coletando nomes de widgets e a coluna e coluna do item associado (quando presente) e o nome do layout em uma lista.
  • Aumentar a ordem bruta com a guia Manual para, ou seja, reorganize a lista de acordo com <tabstops> Seção no XML, um par de cada vez (como QWidget.setTabOrder faz isso).
  • Digitalize a lista e verifique, em seguida, todas as linhas e colunas estão em ordem (independentemente para cada nome de layout).

Outras dicas

Parece que você tem um arquivo .ui com um qtabwidget e uma infinidade de páginas no arquivo .ui. Eu sugeriria dividir as coisas um pouco mais. Implementar cada guia como um widget por si só, isso também pode estar no desgosto. Então você tem duas opções para o próprio TabWidget. Crie todas as guias no designer e promova o conteúdo da classe Widget que precisa continuar nessa página. Ou deixe o TabWidget completamente vazio e preencha -o em código com os subwidgets apropriados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top