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 criar UIs

Qualquer modificação == compilar código
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)
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
Tipos básicos do QML

bool

int

string

real

variant

url

color

date
Tipos básicos do QML

double

list

point

rect

time

...
Elementos básicos do QML

Item

Component

QtObject
Elementos gráficos e textuais

Text

Image

BorderImage
Mouse e interação

MouseArea

Flickable

Keys
Posicionadores e repetidores

Column

Row

Grid

Repeater
Anchor Layout


Define relações entre as âncoras dos itens
Poder posicionar os itens usando o conceito de
âncoras
Anchor Layout

Exemplo
Propriedades


Componentes QML tem propriedades que
podem ser lidas e modificadas por outros
objetos
Propriedades podem ser criadas pelo
desenvolvedor
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
Property Binding


Qualquer expressão JavaScript também pode
ser usado
Acessar propriedades de objetos, chamar
funções e usar objetos JavaScript (built-in)
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”
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
Elemento Binding


Usado para assegurar que a propriedade
“target” sempre terá um determinado valor
O “binding” nunca é perdido
Signals e Handlers


Signals: Mesmo conceito do Qt
Cada sinal tem o seu handler, sempre no
formato: on<signalName>
Signals e Handlers



Cada propriedade do QML tem seu signal
Consequentemente, cada signal da
propriedade, também terá seu handler
Formato: on<propertyName>Changed
Eventos de Mouse

Signals e handlers para interagir com eventos
de mouse

Elemento MouseArea

Signals

pressed

clicked

canceled

doubleClicked

released
Eventos de Mouse

Exemplo
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”
Criando Componentes

Componente é algum elemento QML que
pode ser instanciado

Geralmente definido em um arquivo .qml

Reutilização de código
Criando Componentes

Exemplo:
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
Criando Componentes


Componentes também podem ser definidos
dentro do próprio Item
Criação feita com o método createObject
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
Estados



Elementos de um State

PropertyChanges

StateGroup

StateChangeScript

ParentChange

AnchorsChanges
Propriedade state é sempre presente em um
Item
Item sempre inicia no estado “default”
Criando Estados
Criando Estados

Estados podem ser ativados de acordo com
alguma condição, usando a propriedade “when”
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
Animações e Transições

Animação de propriedades

PropertyAnimation

NumberAnimation

ParentAnimation

AnchorAnimation
Animações e Transições

Exemplo
Animações e Transições

Exemplo
Views e Models

Views são coleções de itens

Views do QML

ListView

GridView

PathView

WebView
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
Views e Models

ListModel

Hierarquia de elementos com “roles”
Views e Models

XmlListModel

Constrói um model através de um arquivo
XML

Roles são especificados pelo XmlRole
Views e Models

Exemplo
Criando Tipos

Tipos mais complexos podem ser criados no
C++ e exportados pro QML

Herdam de QObject

Plugins são utilizados para isso
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
Criando Tipos

Criando seu tipo
Criando Tipos

Exemplo de Plugin
Criando Tipos

Depois dos passos anteriores podemos no
QML fazer
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
Download

qml aula 2 ppt