QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API...

46
QML Thiago Lacerda openbossa - INdT

Transcript of QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API...

Page 1: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

QML

Thiago Lacerdaopenbossa - INdT

Page 2: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Por quê?

Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView)

Diminuindo a velocidade para criar UIs Qualquer modificação == compilar código

Page 3: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

O que é QML?

Introduzido no Qt 4.7 Linguagem declarativa para criar UIs ricas Descreve a “cara” da UI, assim como seu

comportamento UI é tratada como uma arvóre de objetos, com

propriedades (colocar exemplo de properties)

Page 4: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Benefícios

Facilidade para criar UIs ricas Menos código Totalmente integrada com o Qt Integrada com JavaScript Fácil para modularizar o código Estreita a relação entre os desenvolvedores e

designers Plugins Sem compilação

Page 5: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Tipos básicos do QML

bool int string real variant url color date

Page 6: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Tipos básicos do QML

double list point rect time ...

Page 7: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Elementos básicos do QML

Item Component QtObject

Page 8: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Elementos gráficos e textuais

Text Image BorderImage

Page 9: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Mouse e interação

MouseArea Flickable Keys

Page 10: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Posicionadores e repetidores

Column Row Grid Repeater

Page 11: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Anchor Layout

Define relações entre as âncoras dos itens Poder posicionar os itens usando o conceito de

âncoras

Page 12: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Anchor Layout

Exemplo

Page 13: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Propriedades

Componentes QML tem propriedades que podem ser lidas e modificadas por outros objetos

Propriedades podem ser criadas pelo desenvolvedor

Page 14: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Property Binding

Faz um “bind” do valor de uma propriade, para ter sempre o valor de outra propriedade

O valor da propriedade é automaticamente atualizado, caso o valor da outra seja mudado

Page 15: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Property Binding

Qualquer expressão JavaScript também pode ser usado

Acessar propriedades de objetos, chamar funções e usar objetos JavaScript (built-in)

Page 16: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Elements and Objects as Property Values

O “binding” também pode ser feito com objetos

Tenha cuidado quando referenciar o pai de um objeto que está sendo usado como “binding”

Page 17: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Property Aliases

Não aloca espaço para essa propriedades to tipo “alias”

Conecta a nova propriedade diretamente com outra (como um túnel)

Tem o mesmo tipo da propriedade destino

Page 18: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Elemento Binding

Usado para assegurar que a propriedade “target” sempre terá um determinado valor

O “binding” nunca é perdido

Page 19: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Signals e Handlers

Signals: Mesmo conceito do Qt Cada sinal tem o seu handler, sempre no

formato: on<signalName>

Page 20: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Signals e Handlers

Cada propriedade do QML tem seu signal Consequentemente, cada signal da

propriedade, também terá seu handler Formato: on<propertyName>Changed

Page 21: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Eventos de Mouse

Signals e handlers para interagir com eventos de mouse

Elemento MouseArea Signals

pressed clicked canceled doubleClicked released

Page 22: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Eventos de Mouse

Exemplo

Page 23: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Eventos de Mouse

Os handlers da MouseArea recebem um MouseEvent como parâmetro

Com ele podemos Saber que botão do mouse foi apertado Posição do mouse

Objeto “mouse”

Page 24: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Componentes

Componente é algum elemento QML que pode ser instanciado

Geralmente definido em um arquivo .qml Reutilização de código

Page 25: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Componentes

Exemplo:

Page 26: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Componentes

Componentes criados no mesmo diretório são vistos sem problemas

Quando utilizar dentro de outro arquivo, o nome deve ser igual ao usado para nomear o arquivo

Component.onCompleted e Component.onDestruction

Handlers usados para fazer alguma ação quando o componente acaba de ser carregado ou destruído

Page 27: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Componentes

Componentes também podem ser definidos dentro do próprio Item

Criação feita com o método createObject

Page 28: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Estados

Componentes podem ter vários estados Dependendo do estado, algumas ações

podem ser tomadas, propriedades mudadas, etc.

Exemplo: um sinal de trânsito Conjunto de propriedades definidas em um

elemento State

Page 29: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Estados

Elementos de um State PropertyChanges StateGroup StateChangeScript ParentChange AnchorsChanges

Propriedade state é sempre presente em um Item

Item sempre inicia no estado “default”

Page 30: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Estados

Page 31: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Estados

Estados podem ser ativados de acordo com alguma condição, usando a propriedade “when”

Page 32: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Animações e Transições

Durante mudança de estados, podemos querer mudanças animadas nas propriedades

Para animar entre mudança de estados, usamos o elemento Transition

Animações SequentialAnimation ParallelAnimation Behavior PropertyAction ScriptAction

Page 33: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Animações e Transições

Animação de propriedades PropertyAnimation NumberAnimation ParentAnimation AnchorAnimation

Page 34: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Animações e Transições

Exemplo

Page 35: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Animações e Transições

Exemplo

Page 36: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Views e Models

Views são coleções de itens Views do QML

ListView GridView PathView WebView

Page 37: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

View e Models

Você diz como será cada item da sua view Delegate

O model deve ser fornecido para lista preencher seu conteúdo

Possibilidade de exportar seus models em C++ para o QML

Page 38: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Views e Models

ListModel Hierarquia de elementos com “roles”

Page 39: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Views e Models

XmlListModel Constrói um model através de um arquivo

XML Roles são especificados pelo XmlRole

Page 40: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Views e Models

Exemplo

Page 41: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Tipos

Tipos mais complexos podem ser criados no C++ e exportados pro QML

Herdam de QObject Plugins são utilizados para isso

Page 42: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Tipos

Primeiro cria-se uma classe que herda de QDeclarativeExtensionPlugin

Crie seu tipo, derivando de QObject e exporte as propriedade usando a macro Q_PROPERTY

Registre seu tipo com o método registerTypes() Exporte seu plugin usando a macro

Q_EXPORT_PLUGIN2 Crie um arquivo qmldir, para expor seu plugin e

seus tipos QML

Page 43: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Tipos

Criando seu tipo

Page 44: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Tipos

Exemplo de Plugin

Page 45: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Tipos

Depois dos passos anteriores podemos no QML fazer

Page 46: QML Thiago Lacerda openbossa - INdT. Por quê? Muito código necessário, quando se usa a antiga API de UI do Qt (GraphicsView) Diminuindo a velocidade para.

Criando Tipos

Maneira mais fácil de criar um plugin Wizard do QtCreator Cria seu arquivo .pro Cria o esqueleto do seu plugin Cria o qmldir Cria seu tipo inicial