<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eguinaldo C.</title>
    <description>The latest articles on DEV Community by Eguinaldo C. (@eguinaldoc).</description>
    <link>https://dev.to/eguinaldoc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1223849%2F7af7332c-a4ba-46fa-9d47-4f796818ea74.png</url>
      <title>DEV Community: Eguinaldo C.</title>
      <link>https://dev.to/eguinaldoc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eguinaldoc"/>
    <language>en</language>
    <item>
      <title>QML: Focus property</title>
      <dc:creator>Eguinaldo C.</dc:creator>
      <pubDate>Sat, 20 Jul 2024 07:13:23 +0000</pubDate>
      <link>https://dev.to/eguinaldoc/qml-focus-gerenciar-e-depurar-4m6o</link>
      <guid>https://dev.to/eguinaldoc/qml-focus-gerenciar-e-depurar-4m6o</guid>
      <description>&lt;p&gt;Em QML, o foco é um conceito que se refere ao controle do teclado e das interações de entrada de usuário, que é atribuído a um componente específico.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eventos de Teclado em QML
&lt;/h3&gt;

&lt;p&gt;Como o atributo focus está relacionado diretamente ao tratamento de eventos do teclado, então nada mais justo que começarmos por eles.&lt;/p&gt;

&lt;p&gt;Eventos de teclado em QML estão relacionados à classe KeyEvent, e para captarmos esse evento podemos utilizar onKeyPressed e onKeyReleased, &lt;/p&gt;

&lt;p&gt;Apenas os itens com o foco ativo estarão recebendo os eventos do teclado. &lt;/p&gt;

&lt;p&gt;Os eventos de teclado são enviados ao item que está com o foco. Se o item não tratar o evento, ele pode ser propagado para outros itens mais externos, ou do mesmo FocusScope. &lt;/p&gt;

&lt;p&gt;Aqui temos um exemplo prático:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rectangle {
    width: 200
    height: 200
    focus: true // Necessário para receber eventos de teclado

    onKeyPressed: {
        console.log("Key pressed:", event.key)
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basicamente sempre que temos uma ação no teclado o QML verifica se existe algum elemento com o foco ativo, e envia uma notificação de que essa tecla foi pressionada, caso exista, um tratamento para ela será executado,caso contrário irá apenas ignorar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ordem de declaração e Hierarquia
&lt;/h2&gt;

&lt;p&gt;Ao instanciar um componente no QML o primeiro item do seu sistema com o atributo "focus: true" receberá o foco na sua aplicação, e assim este itém estará aberto para receber eventos de teclado, e sim praticamente qualquer componente pode estar habilitado a receber &lt;/p&gt;

&lt;p&gt;Caso você possua vários componentes em um mesmo nivél hierárquico cada um deles com o atributo de "focus: true" apenas o ultimo componente declarado recebe o foco e habilita eventos de usuário.&lt;/p&gt;

&lt;p&gt;Vamos supor que você tenha uma tela de cadastro de usuário com três inputs, sendo eles nome, telefone, endereço, você pode se sentir atraído a declarar seus componentes "focus: true" como no exemplo abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Item {
    TextInput {
        id: textInput1
        width: 100; height: 100
        color: "lightblue"
        text: "Input 1"
        focus: true
    }

    TextInput {
        id: textInput2
        width: 100; height: 100
        x: 120
        color: "lightgreen"
        text: "Input 2"
        focus: true
    }

    TextInput {
        id: textInput3
        width: 100; height: 100
        x: 240
        color: "lightcoral"
        text: "Input 3"
        focus: true
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;apesar do QML tratar-se de uma linguagem declarativa e não estruturada, seus componentes seguem uma ordem de hierarquia e construção, ou seja, os componentes são montados e sobrepostos, na ordem em que foram declarados em seu arquivo. &lt;/p&gt;

&lt;p&gt;O item com o foco habilitado nesse momento é textInput3.&lt;/p&gt;

&lt;p&gt;Esse tipo de equivoco raramente irá acontecer, exceto por alguma distração na hora da criação do componente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Propriedades, métodos
&lt;/h2&gt;

&lt;p&gt;Uma parte fundamental para o entendimento, e prevenção de eventuais bugs, é entender o papel dos atributos e métodos relacionados ao focus;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;focus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É uma propriedade booleana que pode ser definida em seu item, ela pode não refletir o estado atual dele, ou seja, você pode declarar "focus: true" dentro de seu item e mesmo assim ele não receber o foco para si, essa propriedade está mais relacionada a sua intenção de dar foco ao seu componente, e dependendo do contexto em que ele for construido receberá ou não o foco ativo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TextInput {
    id: myInput
    width: 100
    height: 40
    text: "Input Field"
    focus: true // Tentará receber o foco automaticamente
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;activeFocus&lt;/strong&gt;&lt;br&gt;
Também é uma propriedade booleana, porém ao contrário da propriedade focus, ela retorna um valor booleano, esse valor é o estado do foco atual do seu item, ou seja se seu componente realmente estiver com foco ela retornará "true", caso contrário irá retornar "false", geralmente é utilizada em métodos para definir alguns atributos, ou para fins de depuração&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rectangle {
    width: 100
    height: 100
    color: activeFocus ? "green" : "red" // Muda a cor com base no estado do foco ativo
    focus: true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;focusItem&lt;/strong&gt;&lt;br&gt;
Esta é outra propriedade booleana que refere-se ao item que possui o foco atual, ou seja retorna o item que realmente está com o foco naquele momento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;forceActiveFocus()&lt;/strong&gt;&lt;br&gt;
Este método solicita que o item receba o foco imediatamente, mesmo que outros itens estejam com o foco.&lt;/p&gt;
&lt;h2&gt;
  
  
  FocusScope
&lt;/h2&gt;

&lt;p&gt;Trata-se de um componente que gerencia o foco de seus filhos, a fim de evitar comportamentos inexperado.&lt;/p&gt;

&lt;p&gt;Quando eu direciono um foco a um FocusScope,ele garante que os componentes filhos receberão seu foco corretamente.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo iremos criar um Item com dois imputs,e em seguida iremos adicionar dois itens que acabamos de criar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Item{
        id: DoubleInputs
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        width: 200
        height: 100

       Row{
          TextInput {
                    id: input1
                    width: 100
                    height: 40
                    text: "Input 3"
        }

           TextInput {
                     id: input2
                     width: 100
                     height: 40
                     x: 120
                     text: "Input 4"
                     focus: true
           }
       }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ApplicationWindow {
    visible: true
    width: 400
    height: 300

    DoubleInputs {
        id:Double1
        focus:true
        anchors.centerIn: parent
        KeyNavigationDown:Double2
    }
    DoubleInputs {
        id:Double2
        anchors.centerIn: parent
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo teremos quatro inputs, A aplicação iniciará com o foco no Double1, mas ao clicar com a seta que indica "para baixo" no seu teclado, o foco muda para Double2, e eu quero que ao clicar com a seta para baixo a minha aplicação printe no console hello World&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           TextInput {
                     id: input2
                     width: 100
                     height: 40
                     x: 120
                     text: "Input 4"
                     focus: true
                     KeyNavigationUp: console.log("hello World");
           }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém mesmo com o input2 estando com o focus atribuido como true, ele não irá receber o foco, pois o componente Item não tem a capacidade de gerenciar o foco de seus filhos, e quando apertamos a tecla "para baixo" o foco é dado para o componente Double2, e não ao seu filho TextInput, e como o Double2 não possui nenhum tratamento para os inputs to teclado, nada irá acontecer, e para resolver esse problema é bem simples. Basta trocar Item por FocusScope&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    FocusScope{
        id: DoubleInputs
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        width: 200
        height: 100

       Row{
          TextInput {
                    id: input1
                    width: 100
                    height: 40
                    text: "Input 3"
        }

           TextInput {
                     id: input2
                     width: 100
                     height: 40
                     x: 120
                     text: "Input 4"
                     focus: true
           }
       }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim ao receber a atribuição de foco, o FocusScope irá redistribuir o foco para seus filhos de acordo com a lógica implementada por você. Lembrando que o último componente com "focus: true" é que irá realmente receber a primeira atribuição da propriedade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Para ter um melhor proveito e evitar possiveis bugs relacionados aos inputs periféricos da sua aplicação, é extremamente importante dominar os conceitos do foco em componentes do QML.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
