• Nenhum resultado encontrado

Principais classes e conceitos básicos de Qt. Danilo Freire de Souza Santos

N/A
N/A
Protected

Academic year: 2021

Share "Principais classes e conceitos básicos de Qt. Danilo Freire de Souza Santos"

Copied!
26
0
0

Texto

(1)

Começando a programar com Qt

Começando a programar com Qt

Principais classes e conceitos básicos de Qt

(2)

Roteiro

Roteiro

Hello World

Projetos em Qt

Signals e Slots

Modelo de Objetos

(3)

Começando do zero

Começando do zero

Hello World

#include <QApplication> #include <QLabel>

int main(int argc, char *argv[]) {

QApplication a(argc, argv); QLabel hello("Hello World"); hello.show();

//hello.showMaximized(); //hello.showMaximized(); return a.exec();

(4)

Explorando o Hello World

Explorando o Hello World

#include <QApplication> includes #include <QApplication>

#include <QLabel>

int main(int argc, char *argv[]) {

QApplication a(argc, argv); QLabel hello("Hello World"); hello.show(); //hello.showMaximized(); includes QApplication Label com a string return a.exec(); } Mostre o Label Execute a

(5)

Arquivos de Projeto

Arquivos de Projeto

 Arquivo .pro

Arquivo com definições do projeto

 Define variáveis para o compilador

 Define variáveis para o compilador

Arquivos fontes, includes, dependências, etc…

 Oferece templates

app: cria um makefile para aplicações lib: cria um makefile para bibliotecas

 Define escopos

QT += core gui TARGET = mymainwindow CONFIG += console TEMPLATE = app SOURCES += main.cpp \ mymainwindow.cpp

Uma definição para Symbian, outra para Desktop, outra para Maemo…

HEADERS += \ mymainwindow.h symbian {

TARGET.UID3 = 0xE515E66B

vendorinfo = \ "%{\"Nokia\"}" \ ":\"Nokia\"" my_deployment.pkg_prerules = vendorinfo

(6)

qmake e build…

qmake e build…

qmake é o “pré-compilador” do Qt

Gera os arquivos makefile para o compilador C++ Gera os arquivos makefile para o compilador C++ Gera outros arquivos fontes (Meta-Object)

Utiliza como base o arquivo de projeto .pro /> qmake

Depois de executar o qmake, chame o make

/> make

Não se preocupem, o QtCreator gerencia isso para

(7)

Executando no Qt Creator

Executando no Qt Creator

Usando o Qt Simulator

Sigam as instruções do Professor!

Sigam as instruções do Professor!

(8)

Executando em Symbian (no aparelho)

Executando em Symbian (no aparelho)

Pré-requisitos

Instalar o Nokia Ovi Suite no Computador

Instalar o Nokia Ovi Suite no Computador

Instalar o Nokia TRK no Celular

 Pacote de instalação no Qt SDK

Conecte o aparelho via USB

Mude o “target” de compilação para Symbian

Siga instruções do professor!

Observe se o Qt Creator identificou o aparelho

Run!

(9)

Explorando o projeto Symbian

Explorando o projeto Symbian

Arquivos de compilação Symbian são criados

automaticamente pelo Qt SDK (qmake, etc…)

automaticamente pelo Qt SDK (qmake, etc…)

São gerados:

Arquivos pkg para geração de instaladores

Arquivos mmp, que são os arquivos “makefile” do symbian Arquivos de recursos, etc

Arquivos de recursos, etc

(10)

Organizando em Layouts

Organizando em Layouts

Incrementando o Hello World:

#include <QApplication>

Dividindo a tela em um layout vertical

#include <QApplication> #include <QPushButton> #include <QVBoxLayout> #include <QSpinBox> #include <QSlider>

int main(int argc, char *argv[]) {

QApplication a(argc, argv); QWidget window;

QVBoxLayout* layout = new QVBoxLayout(&window); QSpinBox* spinBox = new QSpinBox();

QSlider* slider = new QSlider(Qt::Horizontal);

QPushButton hello = new QPushButton("Hello World");

Criando novos elementos que derivam de QWidget

QPushButton hello = new QPushButton("Hello World"); layout->addWidget(spinBox); layout->addWidget(slider); layout->addWidget(hello); window.showFullscreen(); return a.exec(); }

(11)

Layouts mais comuns

Layouts mais comuns

QHBoxLayout:

Layout Horizontal

QVBoxLayout:

Layout Vertical

QGridLayout:

Grade Grade

QFormLayout:

(12)

Criando Conexões

Criando Conexões

Vamos adicionar funcionalidade a aplicação.

Caso de uso: A aplicação está em Fullscreen(), precisamos sair Caso de uso: A aplicação está em Fullscreen(), precisamos sair dela.

Como faz?

Usar Signals e Slots:

QObject::connect(hello, SIGNAL(clicked()), &a, SLOT( quit() ) ) ;

Interpretando:

(13)

Callbacks X Signals & Slots

Callbacks X Signals & Slots

Callbacks

Geralmente são ponteiros

Signals & Slots

• Separação:

Geralmente são ponteiros

para funções

São pouco flexíveis

– As funções devem ser casadas em tempo de compilação

• Separação:

– Signal: Emitido para lançar um evento

– Slot: Uma função que pode ser ligada em um signal, ou seja, a ação para um evento

• Garantem a conexão entre tipos (type-safe)

– Não garantem a segurança de tipo (*void)

tipos (type-safe)

• Vários objetos Qt já oferecem seus Signals e Slots

(14)

Conexões…

Conexões…

Objeto 1 Signal 1 Objeto 2 Signal 1 Signal 1 Signal 2 Slot 1 Slot 2 Slot 3 Signal 1 Signal 2 Slot 1 Slot 2 Slot 3 Objeto 3 Signal 1 Signal 1 Signal 2 Slot 1 Slot 2

(15)

Múltiplas Conexões

Múltiplas Conexões

Objeto 1 Signal 1 Objeto 2 Signal 1 Signal 1 Signal 2 Slot 1 Slot 2 Slot 3 Signal 1 Signal 2 Slot 1 Slot 2 Slot 3 Objeto 3 Signal 1

Signal 2 executa dois SLOTs

Signal 1 Signal 2 Slot 1 Slot 2 Slot 3

(16)

Exemplo – múltiplas conexões

Exemplo – múltiplas conexões

#include <QApplication> #include <QPushButton> #include <QVBoxLayout> #include <QSpinBox> #include <QSlider> #include <QSlider>

int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget window;

QVBoxLayout* layout = new QVBoxLayout(&window); QSpinBox* spinBox = new QSpinBox();

QSlider* slider = new QSlider(Qt::Horizontal);

QPushButton hello = new QPushButton("Hello World"); layout->addWidget(spinBox);

layout->addWidget(slider); layout->addWidget(hello); window.showFullscreen(); window.showFullscreen();

QObject::connect( hello, SIGNAL( clicked() ) ), &a, SLOT( aboutQt() ) );

QObject::connect( hello, SIGNAL( clicked() ) ), &window, SLOT( showMaximized() ) );

(17)

Parâmetros em Signals

Parâmetros em Signals

É possível transmitir parâmetros em sinais

QObject::connect( spinBox, SIGNAL( valueChanged(int) ), slider, SLOT( setValue(int) ) );

SLOT( setValue(int) ) );

O tipo do parâmetro do signal deve “casar” com o

do slot

Se não existir um Signal compatível com o SLOT, não ocorrerá erro de Compilação!

Entretanto, um warning em tempo de execução aparecerá.

Porque é type-safe?

Porque é type-safe?

Sem conexão se os tipos não casarem ou se o signal ou slot não existir

(18)

Exemplo – Parâmetro em Signals

Exemplo – Parâmetro em Signals

#include <QApplication> #include <QPushButton> #include <QVBoxLayout> #include <QSpinBox> #include <QSlider> #include <QSlider>

int main(int argc, char *argv[]) {

QApplication a(argc, argv); QWidget window;

QVBoxLayout* layout = new QVBoxLayout(&window); QSpinBox* spinBox = new QSpinBox();

QSlider* slider = new QSlider(Qt::Horizontal);

QPushButton hello = new QPushButton("Hello World"); layout->addWidget(spinBox);

layout->addWidget(slider); layout->addWidget(slider); layout->addWidget(hello); window.showFullscreen();

QObject::connect( spinBox, SIGNAL( valueChanged(int) ), slider, SLOT( setValue(int) ) );

(19)

Exercício 2

Exercício 2

Tomem como base o último exemplo!

Crie um widget com um slider e um spinbox. Crie um widget com um slider e um spinbox.

Quando o slider alterar o valor, alterem o valor no spinbox, e vice e versa.

(20)

Qt Object Model

Qt Object Model

QtObject extende as funcionalidades de Classes

C++

C++

Adiciona mais flexibilidade e preserva a eficiência

de C++

Gerenciamento de Memória Signals e Slots Signals e Slots Propriedades e meta-information  Introspecção em C++

(21)

QObject

QObject

Principal classe de Qt

Necessária para fazer uso de meta-information Necessária para fazer uso de meta-information

“moc” – Meta-Object Compiler

Interpreta QObjects e extende o código fonte com funções extras

#include <QObject>

class MyClass: public QObject {

Q_OBJECT ...

};

Interpreta QObjects e extende o código fonte com funções extras Remove palavras chaves de Qt (signals, slot, emit), e gera um

código fonte C++ padrão

(22)

Mais Signals e Slots

Mais Signals e Slots

 Tipos de conexão:

Direta: Conexão padrão, o Slot é executado imediatamente depois do Signal Queued: O Slot é executado posteriormente (na volta do event loop de

Queued: O Slot é executado posteriormente (na volta do event loop de execução de Qt)

 Implementação

Signals:

 Gerados automaticamente pelo moc  Definam no .h (nunca no .cpp).

 Não retorna valor  Não retorna valor Slots:

 Podem ser virtuais, nunca estáticos

(23)

Implementando seus Signals e Slots

Implementando seus Signals e Slots

Criar um QObject Contador com:

1 SLOT: função que atribui um valor a uma variável 1 SLOT: função que atribui um valor a uma variável

1 SIGNAL: sinal que é emitido quando a variável é alterada

Crie um QPushButton

Conecte o signal clicked() ao SLOT do contador

Crie um Qlabel

Conecte o Signal de Contador ao SLOT setNum() do Qlabel

(24)

Meta-Object Compiler

Meta-Object Compiler

Geração dos arquivos moc_...

O que o moc nos oferece:

O que o moc nos oferece:

Signals and Slots

metaObject(): retorna o meta-object para a classe

QMetaObject::className(): retorna o nome da classe em tempo de execução

inherits(): checa a instância atual herda de outra classe tr(): traduz strings

tr(): traduz strings

setProperty() e property(): acessa e atribui valores a propriedades dinamicamente

(25)

Gerenciamento de Memória

Gerenciamento de Memória

QObject implementa uma hierarquia pai-filho

Ao criar um QObject com a referência do pai, o pai adiciona o Ao criar um QObject com a referência do pai, o pai adiciona o objeto a sua lista de filhos

Quando o pai for deletado, todos os filhos são deletados automaticamente

Se o filho for deletado, ele é removido da lista do pai automaticamente

CUIDADO: Apenas são gerenciados objetos criados com a referência do pai!

referência do pai!

Em relação aos widgets

(26)

Exemplo

Exemplo

QWidget* win = new QWidget();

QVBoxLayout* layout = new QVBoxLayout(win); QPushButton* botao = new QPushButton("Label"); layout->addWidget(botao);

layout->addWidget(botao); win->show();

QWidget* win = new QWidget();

QVBoxLayout* layout = new QVBoxLayout(win); QPushButton* but = new QPushButton("Label");

QPushButton é filho de quem?

QPushButton* but = new QPushButton("Label"); layout->addWidget(but);

win->show();

Referências

Documentos relacionados

REDES INSTALACAO E COMERCIO DE REDES

No entanto, Kimura e Harshiman (1984) relatam que as mulheres tendem a ir melhor que os homens em provas que avaliaram a velocidade perceptual, fluência verbal,

Sobre os motivos que levam a mulher a postergar a maternidade, verificou-se nesses estudos, uma variedade de situações que ocasionam esse fato; de modo geral, esse

A determinação da direcção da fonte sonora (Sound Direction Of Arrival - SDOA) centra-se no cálculo da diferença de tempo interaural, em inglês Interaural Time Diference

Climate change in coastal areas Consequences of climate change in sandy coasts, estuaries and lagoons, and rocky shores Changes on coastal risk as a result of climate change

Performances heteronormativas de masculinidades faziam-se presentes na educação de sujeitos masculinos, por meio do discurso proposto pela Educação Física, objetivando a

Palavra=dicionario[id]; return Palavra; } } Forca.h #ifndef FORCA_H_INCLUDED #define FORCA_H_INCLUDED #include&lt;vector&gt; #include &lt;string&gt; using

ADMINISTRADOR GERAR RELATÓRIO COMPRAR INGRESSO REALIZAR LOGIN &lt;&lt;include&gt;&gt; AUTENTICAR VENDA ENVIAR EMAIL &lt;&lt;extend&gt;&gt; GERENTE ADMNISTRADORA CONSULTAR