Você está na página 1de 184

Desenvolvimento

Cross-Platform com C++ e Qt


Sandro Santos Andrade
sandroandrade@kde.org

http://liveblue.wordpress.com

Objetivos

Apresentar as principais funcionalidades do Qt


4.6 utilizadas no desenvolvimento produtivo de
aplicaes cross-platform modernas
Proporcionar uma vivncia prtica inicial das
solues mais utilizadas neste toolkit
motivando a formao de novos
desenvolvedores Qt / KDE
Discutir decises de projeto, idiomas e
ferramentas auxiliares utilizados no Qt

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Pr-requisitos

Necessrios:

Fundamentos de Orientao a Objetos (OO)

Experincia com alguma linguagem OO

Desejveis:

Experincia com desenvolvimento de aplicaes


visuais
Fundamentos da linguagem Standard C++

Especiais:

Padres de projeto, estilos arquiteturais, application


frameworks etc
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Metodologia

Durao: 60 horas

Tpicos expositivos e laboratrios prticos

Referncias:

Livros
Qt Reference
Documentation
Fruns
(QtCentre etc)
Qt Quarterly
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Metodologia

Durao: 60 horas

Tpicos expositivos e laboratrios prticos

Referncias:

Livros
Qt Reference
Documentation
Fruns
(QtCentre etc)
Qt Quarterly
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Sobre o instrutor

Sandro Andrade

Doutorando pelo DMCC (UFBa)


Nove anos de experincia com desenvolvimento em Qt e
treze anos com C++
Dez anos de experincia em atividades docentes
Desenvolvedor KDE nos projetos KDevelop, Gluon e
Plasma. Membro do KDE e.V.
Co-fundador do Live Blue Grupo de Desenvolvedores
KDE da Bahia
Desenvolvedor Qt certificado pela NOKIA

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Viso Geral

O Qt um toolkit para desenvolvimento de


aplicaes cross-platform com recursos para
IPC, networking, XML, SVG, banco de dados,
scripting, OpenGL, animaes, multi-touch,
reconhecimento de gestos, multimdia e
solues mobile

Disponvel publicamente desde maio de 1995

Possui mais de 800 classes e 9000 funes

Utilizado em mais de 70 empresas de ponta

Possui licena dual (LGPL e comercial)


Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Histrico dos Toolkits Grficos

X11

Motif

Tcl / Tk

Fltk

WxWidgets

MFC / AWT / Swing

GTK / Qt

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Viso Geral

Mdulos e ferramentas

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

Viso Geral

Widgets

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

10

Viso Geral

Dialogs e Main Windows

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

11

Viso Geral

Dialogs e Main Windows

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

12

Viso Geral

Dialogs e Main Windows

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

13

Viso Geral

Grficos 2D

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

14

Viso Geral

Grficos 2D

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

15

Viso Geral

Grficos 2D

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

16

Viso Geral

Grficos 2D

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

17

Viso Geral

OpenGL

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

18

Viso Geral

OpenGL

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

19

Viso Geral

OpenGL

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

20

Viso Geral

Scripting

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

21

Viso Geral

Interfaces animadas

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

22

Viso Geral

Model View

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

23

Viso Geral

Banco de Dados

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

24

Viso Geral

Networking

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

25

Viso Geral

XML

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

26

Viso Geral

Ferramentas (Qt Designer)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

27

Viso Geral

Ferramentas (Qt Linguist)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

28

Viso Geral

Ferramentas (Qt Assistant)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

29

Viso Geral

Qt Mobile

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

30

Viso Geral

Qt Mobile

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

31

Viso Geral

Qt Mobile

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

32

Histria do Qt

Primeira verso disponibilizada em 1995, por


Haavard Nord e Eirik Chambe-Eng
Seu desenvolvimento se iniciou em 1991 e em
1993 j existia um ncleo que suportava
widgets
A letra 'Q' foi escolhida porque ela aparecia de
forma bonita no editor emacs de Haavard :)
O t vem da palavra toolkit
Em 1994 foi fundada a Trolltech, antes Troll
Tech e ainda antes Quasar Technologies
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

33

Histria do Qt

Em 1996 foi lanado o Qt 1.1 e a Trolltech tinha


8 clientes
Tambm em 1996 o projeto KDE (na poca
The K Desktop Environment) foi fundado por
Matthias Ettrich
O 'K' (do KDE) era simplesmente a letra que
vinha antes do 'L' (do Linux) :)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

34

Histria do Qt

Em 1997 o Qt passa a ser utilizado no


desenvolvimento do KDE e a verso 1.3
lanada
Em 1999, o Qt2 passa a ser licenciado pela
QPL (Qt Public License)
Em 2000 lanado o Qtopia (Qt para
ambientes mobile)
Neste mesmo, o Qt passa a ser licenciado pela
GPL (GNU Public License)
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

35

Histria do Qt

Em 2001 lanado o Qt3


Em 2005 lanado o Qt4: primeira verso
open-source em todas as plataformas
Em janeiro de 2008 a Trolltech comprada
pela Nokia (Qt Software Qt Development
Frameworks)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

36

Histria do Qt

Em 2009 o Qt passa a ser liberado sob a


licena LGPL e seus repositrios se tornam
abertos a contribuies da comunidade
(qt.gitorious.org)
Em 2010 o Qt adota o modelo de Open
Governance

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

37

Porque o Qt ?

Quem usa o Qt ?

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

38

Instalando o Qt 4.6

Linux:

Via compilao dos fontes obtidos em qt.nokia.com


ou qt.gitorious.org
Via binrios disponibilizados atravs de pacotes
para a sua distribuio
Geralmente existem pacotes separados para:

Bibliotecas e headers
Ferramentas (Designer, Linguist e Assistant)
Demos
Documentao
Qt Creator (IDE)
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

39

Instalando o Qt 4.6

Windows:

Fazer o download do Qt SDK para Windows

Executar o programa de instalao

O programa de instalao ir fazer o download do


MinGW (Minimalist GNU for Windows)
Pode ser utilizado com o Microsoft Visual C++ ou
Eclipse, alm do Qt Creator

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

40

Lab1: Hello Qt
1
2
3
4
5
6
7
8
9
10

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}

Executar:
$ qmake -project
$ qmake
$ make
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

41

Lab1: Hello Qt

O qmake:

Ferramenta que automatiza o processo de


compilao, linking e instalao em diferentes
plataformas
Realiza a gerao automtica de Makefiles a partir
de arquivos de projeto de fcil criao
O arquivo de projeto pode ser criado pelo
desenvolvedor ou automaticamente pelo qmake
(opo -project)
Os mdulos QtCore e QtGui so automaticamente
includos no processo de linking
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

42

Lab1: Hello Qt

O qmake:

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

43

Lab1: Hello Qt

O qmake:

1
2
3
4
5
6
7
8
9
10
11

Arquivo de projeto automaticamente gerado neste


exemplo

###################################################################
# Automatically generated by qmake (2.01a) qua jul 21 22:43:25 2010
###################################################################
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
SOURCES += main.cpp

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

44

Lab1: Hello Qt

O qmake - principais configuraes:

Controlando a informao de debug:


CONFIG += qt [ debug | release | debug_and_release ]
Incluses dependentes de plataforma:
win32 { SOURCES += hellowin.cpp }
unix { SOURCES += hellounix.cpp }
Tipos de template:

app = programa executvel


lib = biblioteca. CONFIG pode conter dll, staticlib ou plugin
subdirs = unio de todos os projetos dos diretrios em SUBDIRS

Plugins: adicione plugin varivel CONFIG


Plugin do Qt Designer: adicione plugin e designer
varivel CONFIG
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

45

Lab1: Hello Qt

O qmake - principais configuraes:

Adicionando e removendo mdulos do Qt:


QT += e QT -=
Utilizando outras bibliotecas;

Adicionando caminhos para os headers:


INCLUDEPATH = c:/msdev/include d:/stl/include
Adicionando bibliotecas:
LIBS += -L/usr/local/lib -lmath

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

46

Lab1: Hello Qt

Algumas consideraes:

O QLabel um dos muitos widgets (windows


gadgets) do Qt
Widgets podem conter outros widgets
A janela principal de um programa Qt geralmente
um QMainWindow ou QDialog contendo outros
widgets
Entretanto, qualquer widget pode representar a
janela principal (neste exemplo, um QLabel)
Por default, todos os widgets so criados ocultos
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

47

Lab1: Hello Qt

Algumas consideraes:

O Qt tem sido cada vez mais utilizado no


desenvolvimento de aplicaes console (sem
interface grfica), devido s grandes facilidades
adicionadas pelo seu modelo de objetos
Nestes casos no necessrio realizar o link com
o mdulo QtGui e deve-se adicionar a instruo
QT -= gui no arquivo de configurao do qmake
Tais aplicaes devem utilizar a classe
QCoreApplication on invs de QApplication

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

48

Modelo de Objetos do Qt

O Qt estende o modelo de objetos do C++ com


as seguintes funcionalidades:

Signals / Slots: mecanismo desacoplado para


comunicao (um-muitos) entre objetos
Object properties: atributos dinmicos
Meta-Objects: para operaes RTTI (Run-Time
Type Information) e de Introspeco
Eventos e filtros de eventos
Traduo contextual de strings para
internacionalizao
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

49

Signals / Slots

Representam um mecanismo central do Qt


Signals e slots so por padro processados
imediatamente no momento da sua execuo
Um signal uma mensagem que est presente
em uma classe como uma declarao de uma
funo-membro void. Signals no so
invocados, mas emitidos (via emit) por um
objeto da classe
Um slot uma funo-membro void e pode ser
normalmente invocada
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

50

Signals / Slots

1
2
3
4
5

Um signal de um objeto pode ser conectado a


slots de um ou mais outros objetos, desde que
os parmetros sejam compatveis
Sintaxe de conexo:

bool QObject::connect(senderqobjptr,
SIGNAL(signalname(argtypelist)),
receiverqobjptr,
SLOT(slotname(argtypelist))
optionalConnectionType);

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

51

Signals / Slots

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

52

Lab2: Signals / Slots

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Um exemplo simples:
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

53

Lab2: Signals / Slots

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Um exemplo simples:
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}

Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12);
b.setValue(48);

// a.value() == 12, b.value() == 12


// a.value() == 12, b.value() == 48

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

54

Lab2: Signals / Slots

Consideraes importantes:

Slots so funes comuns do C++: podem ser


invocadas diretamente, sobrecarregadas, pblicas
ou privadas
Um signal pode ser conectado a vrios slots
Mais de um signal pode ser conectado ao mesmo
slot (o emissor pode ser descoberto com
QObject::sender);
Um signal pode ser conectado a outro signal

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

55

Lab2: Signals / Slots

Consideraes importantes:

Conexes podem ser removidas com


QObject::disconnect
Um signal pode ter um nmero de parmetros
maior ou igual ao nmero de parmetros do slot
conectado
Signals e slots podem ser utilizados em qualquer
classe derivada de QObject, no somente widgets

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

56

Lab2: Signals / Slots

Consideraes importantes:

Conexes, em QDialogs, podem ser


automaticamente realizadas (sem requerer o
QObject::connect)
Se as palavras reservadas signals, slots e emit
estiverem sendo utilizadas por outra biblioteca (ex.
boost) pode-se desabilit-las e usar as macros
Q_SIGNALS, Q_SLOTS e Q_EMIT

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

57

Signals / Slots

Como signals e slots so implementados ?

As palavras reservadas signals, slots e emit (bem


como foreach e recursos de meta-objetos,
propriedades etc) no esto presentes no Standard
C++
Essas extenses so tratadas pelo MOC (MetaObject Compiler)
O qmake verifica quais classes, declaradas na
varivel HEADER, utilizam a macro Q_OBJECT e
automaticamente inclui a invocao do moc no
arquivos Makefile gerados
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

58

Signals / Slots

Como signals e slots so implementados ?

O MOC (Meta-Object Compiler)

Cdigo com
extenses do Qt
Ex: Q_OBJECT
public slots:
MOC
(Meta-Object
Compiler)

Cdigo
Standard C++

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

59

Layout e Parentesco

Layouts gerenciam a geometria dos widgets de


uma janela
Um widget pode ter uma relao de parentesco
com outro widget
Exemplo:

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

60

Layout e Parentesco

Layouts gerenciam a geometria dos widgets de


uma janela
Um widget pode ter uma relao de parentesco
com outro widget
Exemplo:
QWidget
(top-level
window)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

61

Layout e Parentesco

Layouts gerenciam a geometria dos widgets de


uma janela
Um widget pode ter uma relao de parentesco
com outro widget
Exemplo:
QWidget
(top-level
window)

QSlider
(filho do
QWidget)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

62

Layout e Parentesco

Layouts gerenciam a geometria dos widgets de


uma janela
Um widget pode ter uma relao de parentesco
com outro widget
Exemplo:
QWidget
(top-level
window)

QSpinBox
(filho do
QWidget)

QSlider
(filho do
QWidget)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

63

Layout e Parentesco

Tipos de layout:

QHBoxLayout

QVBoxLayout

Layouts dinmicos e em fluxo

QGridLayout

QformLayout

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

64

Layout e Parentesco

Conexo de signals e slots

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

65

Lab3: Layout e Parentesco


1
2
3
4

#include
#include
#include
#include

<QApplication>
<QHBoxLayout>
<QSlider>
<QSpinBox>

15

QObject::connect(spinBox,
SIGNAL(valueChanged(int)),
slider,
SLOT(setValue(int)));
QObject::connect(slider,
SIGNAL(valueChanged(int)),
spinBox,
SLOT(setValue(int)));
spinBox->setValue(35);
QHBoxLayout *layout =
new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window->setLayout(layout);
window->show();
return app.exec();

19

5
6 int main(int argc, char *argv[])
7 {
8
QApplication app(argc, argv);
9
QWidget *window = new QWidget;
10
window->setWindowTitle
("Enter Your Age");
11
QSpinBox *spinBox =
new QSpinBox;
12
QSlider *slider =
new QSlider(Qt::Horizontal);
13
spinBox->setRange(0, 130);
14
slider->setRange(0, 130);

20
21
22
23
24
25
26
27

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

66

Lab3: Layout e Parentesco

Consideraes sobre relaes de parentesco:

O pai automaticamente assume a responsabilidade de


liberao de memria de todos os filhos
Os filhos so liberados quando o pai sair do escopo
Os nicos objetos a serem deletados manualmente so
os criados com new e que no possuem pai
Se um filho deletado antes do pai ele
automaticamente excludo da lista de filhos do pai
Widgets filhos so vistos dentro da rea do pai
A execuo do show() no pai automaticamente exibe
todos os filhos

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

67

Lab3: Layout e Parentesco

Hierarquia das classes utilizadas:

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

68

Qt e IDE's

Principais IDE's multi-plataforma:

Qt Creator (IDE oficial do Qt)

KDevelop (http://www.kdevelop.org)

XCode (http://developer.apple.com/tools/xcode/)

Visual Studio (http://msdn.microsoft.com/enus/vstudio)

Eclipse (http://www.eclipse.org/)

Edyuk (http://www.edyuk.org)

QDevelop (http://www.qdevelop.org/)
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

69

Qt Reference Documentation

http://doc.qt.nokia.com/4.6/

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

70

Main Windows e Dialogs

Uma aplicao geralmente formada por uma


tela principal (QMainWindow) e por vrias
outras telas (QDialog)
Essas telas podem ser criadas manualmente
ou atravs do Qt Designer
Exemplo
(Dialog):

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

71

Main Windows e Dialogs

Layout e relaes de parentesco:

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

72

Main Windows e Dialogs

Dialogs pr-existentes no Qt:

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

73

Main Windows e Dialogs

Dialogs pr-existentes no Qt:

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

74

Lab4: Dialogs
1
2
3
4
5
6
7
8
9
10
11
12

#include <QDialog>
15
class
class
class
class

QCheckBox;
QLabel;
QLineEdit;
QPushButton;

class FindDialog : public QDialog


{
Q_OBJECT
public:
FindDialog
(QWidget *parent = 0);
13 signals:
14
void findNext(
const QString &str,
Qt::CaseSensitivity cs);

16
17
18
19
20
21
22
23
24
25
26

void findPrevious(
const QString &str,
Qt::CaseSensitivity cs);
private slots:
void findClicked();
void enableFindButton(
const QString &text);
private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;
};

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

75

Lab4: Dialogs
1
2
3
4

5
6
7
8
9
10
11
12

13
14

#include <QtGui>
#include "finddialog.h"
FindDialog::FindDialog(
QWidget *parent) :
QDialog(parent)
{
label = new QLabel(
tr("Find &what:"));
lineEdit = new QLineEdit;
label->setBuddy(lineEdit);

15
16
17
18
19
20

caseCheckBox =
new QCheckBox(tr("Match &case"));

21
22

backwardCheckBox =
new QCheckBox(
tr("Search &backward"));

23
24

findButton = new
QPushButton(tr("&Find"));

25

findButton->setDefault(true);
findButton->setEnabled(false);
closeButton = new
QPushButton(tr("Close"));
connect(lineEdit,
SIGNAL(textChanged(
const QString &)),
this,
SLOT(enableFindButton(
const QString &)));
connect(findButton,
SIGNAL(clicked()),
this, SLOT(findClicked()));
connect(closeButton,
SIGNAL(clicked()),
this, SLOT(close()));

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

76

Lab4: Dialogs
26
27
28
29
30
31
32
33
34
35
36
37
38

QHBoxLayout *topLeftLayout =
new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(
lineEdit);
QVBoxLayout *leftLayout =
new QVBoxLayout;
leftLayout>addLayout(
topLeftLayout);
leftLayout->addWidget(
caseCheckBox);
leftLayout->addWidget(
backwardCheckBox);
QVBoxLayout *rightLayout =
new QVBoxLayout;
rightLayout->addWidget(
findButton);
rightLayout->addWidget(
closeButton);
rightLayout->addStretch();

39

QHBoxLayout *mainLayout =
new QHBoxLayout;
mainLayout->addLayout(
leftLayout);
mainLayout->addLayout(
rightLayout);
setLayout(mainLayout);

40
41
42
43
44
45
46
47

setWindowTitle(tr("Find"));
setFixedHeight(
sizeHint().height());
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

77

Main Windows e Dialogs

Main Windows so widgets que podem conter


menus, toolbars e barra de status
Main Windows so criadas atravs da
derivao da classe QMainWindow
O Qt Designer facilita sobremaneira a criao
de Main Windows e Dialogs

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

78

Main Windows e Dialogs

reas definidas pela QMainWindow

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

79

Main Windows e Dialogs

Menus e toolbars baseiam-se no conceito de


action:

Um action um item que pode ser adicionado a


qualquer nmero de menus e toolbars

Criar menus e toolbars requer trs passos:

Criao e configurao dos actions

Criao do menu e utilizao dos actions

Criao das toolbars e utilizao dos actions

Todo action possui o signal triggered()


Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

80

Lab5: Main Windows

Criando um action:

1
2
3
4
5

QAction *newAction = new QAction(tr("&New"), this);


newAction->setIcon(QIcon(":/images/new.png"));
newAction->setShortcut(tr("Ctrl+N"));
newAction->setStatusTip(tr("Create a new spreadsheet file"));
connect(newAction, SIGNAL(triggered()), this, SLOT(newFile()));

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

81

Lab5: Main Windows

Inserindo actions em menus

1
2
3
4
5

QMenu *fileMenu = menuBar()->addMenu(tr("&File"));


fileMenu->addAction(newAction);
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addAction(saveAsAction);

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

82

Lab5: Main Windows

Inserindo actions em toolbars

1
2
3
4
5
6
7
8

QToolBar *fileToolBar = addToolBar(tr("&File"));


fileToolBar->addAction(newAction);
fileToolBar->addAction(openAction);
fileToolBar->addAction(saveAction);
QToolBar *editToolBar = addToolBar(tr("&Edit"));
editToolBar->addAction(cutAction);
editToolBar->addSeparator();
editToolBar->addAction(findAction);

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

83

Lab5: Main Windows

Criando a barra de status

1
2
3
4
5
6
7
8
9

QLabel *locationLabel = new QLabel(" W999 ");


QLabel *formulaLabel = new QLabel;
statusBar()->addWidget(locationLabel);
statusBar()->addWidget(formulaLabel, 1);
connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)),
this, SLOT(updateStatusBar()));
connect(spreadsheet, SIGNAL(modified()),
this, SLOT(spreadsheetModified()));
updateStatusBar();

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

84

Lab5: Main Windows

Usando um message box

1 int r = QMessageBox::warning(this, tr("Spreadsheet"),


2
tr("The document has been modified.\n"
3
"Do you want to save your changes?"),
4
QMessageBox::Yes | QMessageBox::Default,
5
QMessageBox::No,
6
QMessageBox::Cancel | QMessageBox::Escape);
7 if (r == QMessageBox::Yes)
8
return save();
9 else
10
if (r == QMessageBox::Cancel)
11
return false;

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

85

Main Windows e Dialogs

As imagens utilizadas pela aplicao (cones


etc) podem ser carregadas de trs formas:

Atravs da leitura, em tempo de execuo, dos


arquivos das imagens
Atravs da incluso de imagens XPM no cdigofonte
Atravs do uso do mecanismo de resources do Qt

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

86

Main Windows e Dialogs

Resources:

O arquivo de recursos de uma aplicao Qt indica


quais arquivos sero diretamente includos no
executvel a ser gerado. Dessa forma, cones no
so perdidos
Na verdade, qualquer tipo de arquivo (no somente
imagens) pode ser includo no executvel
Arquivos de recursos podem ser organizados em
categorias
Recursos so utilizados com o prefixo :/
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

87

Lab6: Resources

Utilizando resources ao invs de caminhos


absolutos de cones e imagens
Dicas sobre actions:

Pode-se especificar aceleradores colocando o


caracter '&' antes do caracter acelerador
Pode-se especificar teclas de atalho na
propriedade shorcut
Pode-se especificar tips de toolbar e mensagens de
status nas propriedades toolTip e statusTip

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

88

Main Windows e Dialogs

Entendendo o Qt Designer
Descrio XML
do dialog ou
mainwindow
(arquivo .ui)
UIC
(User Interface
Compiler)
Cdigo
Standard C++
(classe no namespace Ui)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

89

Main Windows e Dialogs

Fluxo de trabalho no Qt Designer:

Crie a sua Main Window ou Dialog no Qt Designer


Crie uma nova classe derivando da classe base
correspondente e agregando a classe gerada a
partir do Qt Designer
Implemente a sua funcionalidade nesta classe
recm-criada

Isso garante a separao entre o cdigo


gerado pelo Qt Designer e o cdigo que
implementa a funcionalidade
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

90

Lab7: Funcionalidades

1
2
3
4
5
6
7
8
9
10
11

Implementando funcionalidade

#include <QDialog>
#include "ui_cdmainwindow.h"
class CdMainWindow : public QMainWindow, public Ui::CdMainWindow
{
Q_OBJECT
public:
CdMainWindow(QWidget *parent = 0);
private slots:
void on_lineEdit_textChanged();
};

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

91

Lab7: Funcionalidades

1
2
3
4
5
6
7
8
9
10
11
12
13
14

Implementando funcionalidade
#include <QtGui>
#include "cdmainwindow.h"
CdMainWindow::CdMainWindow(QWidget *parent) : QmainWindow(parent)
{
setupUi(this);
QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
lineEdit->setValidator(new QRegExpValidator(regExp, this));
}
void CdMainWindow::on_lineEdit_textChanged()
{
okButton->setEnabled(lineEdit->hasAcceptableInput());
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

92

Lab7: Funcionalidades

Implementando funcionalidade

1
2
3
4
5
6
7
8
9

#include <QApplication>
#include "cdmainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CdMainWindow *mw = new CdMainWindow;
mw->show();
return app.exec();
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

93

Lab7: Funcionalidades

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Usando modeless dialogs


MainWindow::MainWindow(...)
{
...
findDialog = 0;
...
}
void MainWindow::on_findAction_triggered()
{
if (!findDialog)
{
findDialog = new FindDialog(this);
}
findDialog->show();
findDialog->activateWindow();
}
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

94

Lab7: Funcionalidades

Usando modal dialogs

1
2
3
4
5
6
7
8
9

void MainWindow::addCd()
{
AddCdDialog addCdDialog(this);
if (addCdDialog.exec())
{
// Retorna QDialog::Accepted ou QDialog::Reject
...
}
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

95

Lab8: Aplicaes MDI

Aplicaes MDI (Multiple Document Interface)

Criadas utilizando uma instncia de QMdiArea


como centralWidget de uma Main Window
Novas janelas so adicionadas usando
addSubWindow()

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

96

Main Windows e Dialogs

Size policies: especificam como o widget ser


alterado pelo layout manager:

Fixed: o widget no pode aumentar ou diminuir.


Ser sempre mantido no seu tamanho atual
Minimum: o tamanho atual o tamanho mnimo do
widget
Maximum: o tamanho atual o tamanho mximo
do widget
Preferred: o tamanho atual o preferido, mas ele
podem aumentar ou diminuir
Expanding: o widget propenso a aumentar
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

97

Main Windows e Dialogs

Size policies

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

98

Criando Novos Widgets

Novos widgets podem ser criados herdando a


classe QWidget e reimplementando a funo
paint()
A funo paint() automaticamente chamada
sempre que o widget precisa ser (re)
desenhado
As funes de desenho esto concentradas na
classe QPainter
O QPainter suporta operaes de rotao,
translao e escala
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

99

Criando Novos Widgets

Sistema de painting

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

100

Lab9: Widget Relgio


1 void AnalogClock::paintEvent(QPaintEvent *)
2 {
3
static const QPoint hourHand[3] = {
4
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -40)
5
};
6
static const QPoint minuteHand[3] = {
7
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -70)
8
};
9
10
QColor hourColor(127, 0, 127);
11
QColor minuteColor(0, 127, 127, 191);
12
13
int side = qMin(width(), height());
14
QTime time = QTime::currentTime();

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

101

Lab9: Widget Relgio


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(width() / 2, height() / 2);
painter.scale(side / 200.0, side / 200.0);
painter.setPen(Qt::NoPen);
painter.setBrush(hourColor);
painter.save();
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
painter.setPen(hourColor);
for (int i = 0; i < 12; ++i) {
painter.drawLine(88, 0, 96, 0);
painter.rotate(30.0);
}
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

102

Lab9: Widget Relgio


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 }

painter.setPen(Qt::NoPen);
painter.setBrush(minuteColor);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
painter.setPen(minuteColor);
for (int j = 0; j < 60; ++j) {
if ((j % 5) != 0)
painter.drawLine(92, 0, 96, 0);
painter.rotate(6.0);
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

103

Model View

Muitas aplicaes permitem a busca,


visualizao e edio de itens individuais de
um conjunto de dados
Em verses anteriores do Qt, os widgets eram
populados com todo o contedo do conjunto de
dados, estes eram alterados e posteriormente
atualizados na sua origem
Entretanto, esta abordagem no escalvel
para grandes conjuntos e no resolve o
problema da visualizao do mesmo conjunto
ou dois ou mais widgets diferentes
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

104

Model View

O Qt4 usa o padro Model View, uma variao


do model-view-controller, para resolver esses
problemas:

Model: representa o conjunto de dados e responsvel


pela aquisio e atualizao de dados a partir da origem.
Cada tipo de dados tem seu prprio modelo, porm a
API provida pelos modelos aos views padro
View: apresenta os dados para o usurio. Para grandes
conjuntos, exibe somente o necessrio (lazy-load)
Controller: mediador entre o usurio e o view. Converte
aes do usurio em requisies para navegar e editar
dados, os quais so enviados pelo view para o model
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

105

Model View

Qt4 Model View

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

106

Model View

Qt4 Model View

O delegate usado para ter total controle sobre


como os itens so apresentados e editados
O Qt disponibiliza um delegate padro para cada
tipo de view
Os modelos podem obter somente os dados que
so realmente necessrios
Cada item de dados em um modelo representado
por um index
O Qt traz um conjunto de modelos e outros podem
ser criados
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

107

Model View

Os widgets so divididos em dois grupos:

As classes QListWidget, QTableWidget e


QTreeWidget devem ser utilizadas para apresentar
poucos itens
Para grandes conjuntos devem ser utilizadas as
classes QListView, QTableView e QTreeView, em
conjunto com um modelo de dados (do Qt ou
customizado)

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

108

Model View

Modelos predefinidos do Qt:

QStringListModel: armazena uma lista de strings


QStandardItemModel: armazena dados hierrquicos
arbitrrios
QFileSystemModel: encapsula o sistema de arquivos
local
QSqlQueryModel: encapsula um resultset SQL
QSqlTableModel: encapsula uma tabela SQL
QSqlRelationalTableModel: encapsula uma tabela SQL
com chaves estrangeiras
QSortFilterProxyModel: ordena ou filtra outro modelo

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

109

Lab10: Model View

1
2
3
4
5
6
7
8
9
10

Visualizando o sistema de arquivos

QFileSystemModel *model = new QFileSystemModel;


model->setRootPath(QDir::currentPath());
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
tree->setRootIndex(model->index(QDir::currentPath()));
QListView *list = new QListView(splitter);
list->setModel(model);
list->setRootIndex(model->index(QDir::currentPath()));

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

110

Model View

Entendendo as classes de modelo

ndice = linha + coluna + ndice pai

Roles
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

111

Lab11: Delegates

Utilizando outros delegates

1
2
3
4
5
6

class SpinBoxDelegate : public QItemDelegate


{
Q_OBJECT
public:
SpinBoxDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const;
7
void setEditorData(QWidget *editor,
const QModelIndex &index) const;
8
void setModelData(QWidget *editor, QAbstractItemModel *model,
9
const QModelIndex &index) const;
10
void updateEditorGeometry(QWidget *editor,
11
const QStyleOptionViewItem &option,
const QModelIndex &index) const;
12 };
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

112

Lab11: Delegates

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Utilizando outros delegates


QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setMinimum(0);
editor->setMaximum(100);
return editor;
}
void SpinBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue(value);
}
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

113

Lab11: Delegates

Utilizando outros delegates


void SpinBoxDelegate::setModelData(QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index) const
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->interpretText();
int value = spinBox->value();
model->setData(index, value, Qt::EditRole);
}

2
3
4
5
6
7
8
9
10 void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
11
const QStyleOptionViewItem &option,
const QModelIndex &/* index */) const
12 {
13
editor->setGeometry(option.rect);
14 }

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

114

Generic Containers

Classes template de propsito geral para


armazenamento de outros objetos
So implicitamente compartilhados,
reentrantes, com bom desempenho e baixo
consumo de memria e so thread-safe se
utilizados somente de forma read-only
Possuem dois tipos de iterators:

Java-style: fceis de usar

STL-style: ligeiramente mais eficientes

Foreach
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

115

Generic Containers

So implicitamente compartilhados

Podem ser serializados com o QDataStream

Resultam em menos cdigo executvel que os


correspondentes STL

Containers sequenciais: QList, QLinkedList,


QVector, QStack e QQueue
Containers associativos: QMap, QMultiMap,
QHash, QMultiHash e QSet
Algoritmos genricos. Ex: qSort(), qBinaryFind(),
qSwap()
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

116

Generic Containers

Viso Geral:

QList:

QLinkedList:

Implementada como lista encadeada, melhor desempenho para


inseres no meio, melhor semntica de iterators

QVector:

Implementada usando arrays, acesso rpido por ndices,


expanso mnima de cdigo no executvel

Implementado usando arrays, inseres no incio e no meio so


custosas

QStack:

Sub-classe conveniente de QVector com semntica LIFO

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

117

Generic Containers

Viso Geral:

QQueue:

QSet:

Representa conjuntos matemtica com acessos rpidos

Q[Multi]Map:

Sub-classe conveniente de QList com semntica FIFO

Dicionrio que mapeia chaves em valores, armazena os dados


ordenados pela chave

Q[Multi]Hash:

Armazena os dados em ordem arbitrrio, acesso mais rpido


que o Q[Multi]Map

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

118

Generic Containers

Iterators

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

119

Generic Containers

1
2
3
4
5
6
7
8
9
10
11
12

Iterators Java-style
QList<QString> list;
list << "A" << "B" << "C" << "D";
QListIterator<QString> i(list);
while (i.hasNext())
qDebug() << i.next();

QListIterator<QString> i(list);
i.toBack();
while (i.hasPrevious())
qDebug() << i.previous();

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

120

Generic Containers

1
2
3
4
5
6
7
8
9
10
11
12

Iterators com suporte a modificaes


QMutableListIterator<int> i(list);
while (i.hasNext()) {
if (i.next() % 2 != 0)
i.remove();
}

QMutableListIterator<int> i(list);
while (i.hasNext()) {
if (i.next() > 128)
i.setValue(128);
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

121

Generic Containers

1
2
3
4
5
6

Iterators STL-style

QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::iterator i;
for (i = list.begin(); i != list.end(); ++i)
*i = (*i).toLower();

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

122

Generic Containers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Foreach
QLinkedList<QString> list;
foreach (QString str, list) {
if (str.isEmpty())
break;
qDebug() << str;
}
QMap<QString, int> map;
foreach (QString str, map.keys())
qDebug() << str << ":" << map.value(str);
QMultiMap<QString, int> map;
foreach (QString str, map.uniqueKeys()) {
foreach (int i, map.values(str))
qDebug() << str << ":" << i;
}
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

123

Generic Containers

Complexidades:

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

124

Entrada e Saida (E/S)

O Qt disponibiliza duas classes principais para


operaes de entrada e saida:

QTextStream: entrada e saida de dados texto

QDataStream: entrada e saida de dados binrios

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

125

Entrada e Saida (E/S)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Gravando e recuperando dados texto


QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
QTextStream out(&data);
out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
// writes "Result: 3.14
2.7
"
}

QTextStream in("0x50 0x20");


int firstNumber, secondNumber;
in >> firstNumber;
in >> dec >> secondNumber;

// firstNumber == 80
// secondNumber == 0

char ch;
in >> ch;

// ch == 'x'

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

126

Entrada e Saida (E/S)

Manipuladores

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

127

Entrada e Saida (E/S)

1
2
3
4
5
6
7
8
9
10
11
12
13

Gravando e recuperando dados binrio


QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
// we will serialize the data into the file
out << QString("the answer is");
// serialize a string
out << (qint32)42;
// serialize an integer

QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
// read the data serialized from the file
QString str;
qint32 a;
in >> str >> a;
// extract "the answer is" and 42

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

128

Entrada e Saida (E/S)

1
2

Uma srie de classes Qt j suportam entrada e


saida via QDataStream, inclusive os containers

Pode-se adicionar este suporte em novas


classes atravs da implementao dos
operadores << e >>

QDataStream &operator<<(QDataStream &, const QXxx &);


QDataStream &operator>>(QDataStream &, QXxx &);

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

129

Lab12: Containers e E/S

Containers aninhados

Gravao e recuperao usando QDataStream

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

130

Banco de Dados

O mdulo QtSql disponibiliza uma interface


independente de plataforma e de banco de
dados
Essa interface suportada por um conjunto de
classes que usam a arquitetura Model View do
Qt
Uma conexo de banco representada por
uma instncia da classe QSqlDatabase

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

131

Banco de Dados

Drivers disponveis:

QMYSQL: MySQL >= 4


QOCI: Oracle Call Interface
QODBC: Open Database Connectivity
QPSQL: PostgreSQL >= 7.3
QTDS: Sybase Adaptive Server
QDB2: IBM DB2 >= 7.1
QSQLITE2: SQLite v2
QSQLITE: SQLite >= 3
QIBASE: Borland Interbase

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

132

Banco de Dados

O banco pode ser utilizado de duas formas:

Com a classe QSqlQuery possvel a execuo


direta de sentenas SQL
Com classes de mais alto nvel como
QSqlTableModel e QsqlRelationalTableModel

As classes de mais alto nvel podem ser


anexadas a widgets para visualizao
automtica dos dados do banco
O Qt torna fcil a programao de recursos
como master-detail e drill-down
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

133

Banco de Dados

Criando a conexo default

1 inline bool createConnection()


2 {
3
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
4
db.setDatabaseName("cddatabase.db");
5
if (!db.open())
6
{
7
QMessageBox::warning(0, QObject::tr("Database Error"),
8
db.lastError().text());
9
return false;
10
}
11
return true;
12 }

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

134

Banco de Dados

1
2
3
4
5
6
7
8

Executando sentenas SQL

QSqlQuery query;
query.exec("SELECT title, year FROM cd WHERE year >= 1998");
while (query.next())
{
QString title = query.value(0).toString();
int year = query.value(1).toInt();
qDebug() << title << ": " << year << endl;
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

135

Banco de Dados

1
2
3
4
5
6
7
8
9
10
11
12
13

QSqlQuery pode ser utilizado com comandos DDL


e inserts
QSqlQuery query;
query.exec("CREATE TABLE artist (id INTEGER PRIMARY KEY, "
"name VARCHAR(40) NOT NULL, country VARCHAR(40))");
query.exec("CREATE TABLE cd (id INTEGER PRIMARY KEY, "
"title VARCHAR(40) NOT NULL, artistid INTEGER NOT NULL, "
"year INTEGER NOT NULL, "
"FOREIGN KEY (artistid) REFERENCES artist)");
query.exec("CREATE TABLE track (id INTEGER PRIMARY KEY, "
"title VARCHAR(40) NOT NULL, duration INTEGER NOT NULL, "
"cdid INTEGER NOT NULL)");

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

136

Banco de Dados

1
2
3
4
5
6
7
8
9
10
11
12
13

Consultando com QSqlTableModel


QSqlTableModel model;
model.setTable("cd");
model.setFilter("year >= 1998");
model.select();
connect(model, SIGNAL(beforeInsert(QSqlRecord &)),
this, SLOT(beforeInsertArtist(QSqlRecord &)));
for (int i = 0; i < model.rowCount(); ++i)
{
QSqlRecord record = model.record(i);
QString title = record.value("title").toString();
int year = record.value("year").toInt();
qDebug() << title << ": " << year << endl;
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

137

Banco de Dados

Ligando o model a uma view

1
2
3
4
5
6
7
8
9
10
11

model = new QSqlTableModel(this);


model->setTable("artist");
model->setSort(Artist_Name, Qt::AscendingOrder);
model->setHeaderData(Artist_Id, Qt::Horizontal, tr("Id"));
model->setHeaderData(Artist_Name, Qt::Horizontal, tr("Name"));
model->setHeaderData(Artist_Country, Qt::Horizontal, tr("Country"));
model->select();
artistTableView = new QTableView;
artistTableView->setModel(model);
artistTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
artistTableView->resizeColumnsToContents();

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

138

Banco de Dados

Incluindo registros

1
...
2
connect(model, SIGNAL(beforeInsert(QSqlRecord &)),
3
this, SLOT(beforeInsertArtist(QSqlRecord &)));
4
...
5
6
int row = model->rowCount();
7
model->insertRow(row);
8
QModelIndex index = model->index(row, Artist_Name);
9
tableView->setCurrentIndex(index);
10
tableView->edit(index);
11

12
13 void ArtistForm::beforeInsertArtist(QSqlRecord &record)
14 {
15
record.setValue("id", generateId("artist"));
16 }
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

139

Banco de Dados

Incluindo registros

1
2
3
4
5
6
7
8
9

inline int generateId(const QString &table)


{
QSqlQuery query;
query.exec("SELECT MAX(id) FROM " + table);
int id = 0;
if (query.next())
id = query.value(0).toInt() + 1;
return id;
}

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

140

Banco de Dados

Excluindo registros

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 }

tableView->setFocus();
QModelIndex index = tableView->currentIndex();
if (!index.isValid()) return;
QSqlRecord record = model->record(index.row());
QSqlTableModel cdModel;
cdModel.setTable("cd");
cdModel.setFilter("artistid = " + record.value("id").toString());
cdModel.select();
if (cdModel.rowCount() == 0) {
model->removeRow(tableView->currentIndex().row());
} else {
QMessageBox::information(this,
tr("Delete Artist"),
tr("Cannot delete %1 because there are CDs associated "
"with this artist in the collection.")
.arg(record.value("name").toString()));

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

141

Lab13: Banco de Dados

Uso da classe QSqlQuery

Integrao com o Model View

Incluso e Excluso

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

142

Banco de Dados

Relacionamentos e master-detail

1
2
3
4
5

Para o detail usa-se o QSqlTableModel original com


um filtro
Para o master usar o QSqlRelationalTableModel
Capturar o signal currentRowChanged do modelo
master para atualizar o detail

connect(cdTableView->selectionModel(),
SIGNAL(currentRowChanged(const QModelIndex &,
const QModelIndex &)),
this,
SLOT(currentCdChanged(const QModelIndex &)));

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

143

Lab14: Master-Detail

Configurao da base de dados

QSqlRelationalTableModel

QSqlTableModel

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

144

Graphics View

Promove o gerenciamento de uma grande


quantidade de itens grficos 2D e disponibiliza
um widget para visualizao destes itens com
suporte a zomming e rotao
Surgiu no Qt 4.2 substituindo o QCanvas
Promove uma abordagem baseada em itens
para o estilo Model View
Vrias views podem observar uma cena e uma
cena contm itens de vrias formas
geomtricas
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

145

Graphics View

Arquitetura:

Cena:

Prov interface rpida para manipulao uma quantidade


grande de itens
Propaga eventos para cada item
Gerencia o estado do item, como seleo e foco
Prov funcionalidades de rendering sem transformaes

View:

Visualiza o contedo da cena


Recebe eventos de teclado e mouse e os traduz para eventos
de cena
Pode transformar o sistema de coordenadas de cena
Se no transformada visualiza uma unidade da cena como um
pixel na view

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

146

Graphics View

Arquitetura:

Item:

QGraphicsItem a classe base de todos os itens


O Qt disponibiliza itens padro para as primitivas bsicas
Voc pode desenvolver o seu prprio item
Suporte aos eventos de teclado e mouse
Drag and drop
Relacionamento atravs de parentesco e agrupamento
Deteco de coliso atravs da funo shape() e collidsWith()
definido no seu sistema de coordenadas local
Podem sofrer transformaes locais, repassando-as para os
filhos

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

147

Graphics View

Arquitetura:

Itens pr-definidos no Qt

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

148

Graphics View

Sistemas de Coordenadas:

Coordenadas de item, de cena e de view


Funes de convenincia permitem fazer a converso:

Que item foi clicado ?


QGraphicsView::mapToScene() + QGraphicsScene::itemAt()
Onde no view o item est localizado ?
QGraphicsItem::mapToScene() +
QGraphicsView::mapFromScene()
Quais itens esto dentro de uma elipse na view ?
Passe um QPainterPath para
QGraphicsView::mapToScene() + QGraphicsScene::itens()

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

149

Graphics View

Implementando zoom e rotao

1
2
3
4
5
6
7
8
9
10
11

class View : public QGraphicsView


{
Q_OBJECT
...
public slots:
void zoomIn() { scale(1.2, 1.2); }
void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
void rotateLeft() { rotate(-10); }
void rotateRight() { rotate(10); }
...
};

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

150

Lab15: Coordenadas

1
2
3
4
5
6
7
8
9
10
11

Implementar seleo de itens e operaes

QGraphicsScene scene;
QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));
QGraphicsItem *item = scene.itemAt(50, 50);
// item == rect
QGraphicsScene scene;
myPopulateScene(&scene);
QGraphicsView view(&scene);
view.show();

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

151

Lab16: Novos Itens

Implementando novos itens

1 class SimpleItem : public QGraphicsItem


2 {
3 public:
4
QRectF boundingRect() const
5
{
6
qreal penWidth = 1;
7
return QRectF(-10 - penWidth / 2, -10 - penWidth / 2,
8
20 + penWidth, 20 + penWidth);
9
}
10
11
void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
12
{
13
painter->drawRoundedRect(-10, -10, 20, 20, 5, 5);
14
}
15 };
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

152

XML

O Mdulo QtXml disponibiliza duas interfaces


para manipulao de XML:

SAX (Simple API for XML): reporta eventos de


parsing diretamente para a aplicao, pouco
consumo de memria, no suporta navegao na
estrutura
DOM (Document Object Model): converte um
documento XML em uma rvore de objetos, na qual
a aplicao pode navegar. Mantm a estrutura em
memria

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

153

XML

Lendo XML com o SAX

O Qt disponibiliza a classe QXmlSimpleReader


para a leitura no validada de documentos XML
Funes virtuais de objetos handler registrados so
invocadas para sinalizar os eventos

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

154

XML
1
2
3

<doc>
<quote>Ars longa vita brevis</quote>
</doc>

1
2
3
4
5
6
7

startDocument()
startElement("doc")
startElement("quote")
characters("Ars longa vita brevis")
endElement("quote")
endElement("doc")
endDocument()

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

155

Lab17: XML SAX

1
2
3
4
5
6

Exemplo de classe handler para o SAX


class SaxHandler : public QXmlDefaultHandler
{
public:
SaxHandler(QTreeWidget *tree);
bool startElement(const QString &namespaceURI,
const QString &localName, const QString &qName,
const QXmlAttributes &attributes);
bool endElement(const QString &namespaceURI,
const QString &localName, const QString &qName);
bool characters(const QString &str);
bool fatalError(const QXmlParseException &exception);

7
8
9
10 private:
11
QTreeWidget *treeWidget;
12 };

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

156

XML

Processando o XML

1 bool parseFile(const QString &fileName)


2 {
3
QFile file(fileName);
4
QXmlInputSource inputSource(&file);
5
QXmlSimpleReader reader;
6
SaxHandler handler(treeWidget);
7
reader.setContentHandler(&handler);
8
reader.setErrorHandler(&handler);
9
return reader.parse(inputSource);
10 }

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

157

XML

Lendo XML com o DOM

Prov uma interface para acessar e modificar o


contedo e estrutura de um arquivo XML
Todos os ns da rvore do documento so
derivados de QDomNode

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

158

Lab18: XML DOM

Lendo XML com o DOM

1
2
3
4
5
6
7
8
9

QDomDocument doc("mydocument");
QFile file("mydocument.xml");
if (!file.open(QIODevice::ReadOnly))
return;
if (!doc.setContent(&file)) {
file.close();
return;
}
file.close();

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

159

Lab18: XML DOM

10
11
12
13
14
15
16
17
18
19
20
21
22
23

Lendo XML com o DOM


QDomElement docElem = doc.documentElement();
QDomNode n = docElem.firstChild();
while(!n.isNull()) {
QDomElement e = n.toElement();
if(!e.isNull()) {
cout << qPrintable(e.tagName()) << endl;
}
n = n.nextSibling();
}
QDomElement elem = doc.createElement("img");
elem.setAttribute("src", "myimage.png");
docElem.appendChild(elem);

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

160

XML

A partir da verso 4.3 do Qt, as classes


QXmlStreamReader e QXmlStreamWriter
simplificam este processo
O mdulo QtXmlPatterns inclui o uso de
XQuery e XPath para realizar buscas
facilitadas em arquivos XML

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

161

Networking

O Qt disponibiliza as classes QFtp e QHttp,


que podem ser utilizadas para fazer download
e upload de arquivos, bem como solicitar e
receber pginas de servidores web
O Qt tambm prov classes de nvel mais
baixo como QTcpSocket e QUdpSocket
Para tratar conexes em servidores pode-se
utilizar a classe QTcpServer
Disponibiliza recursos para sockets seguros,
certificados, chaves etc.
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

162

Lab19: Networking

1
2
3
4
5

Usando o QNetworkAccessManager

QNetworkAccessManager *manager = new QNetworkAccessManager(this);


connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://qt.nokia.com")));

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

163

Internacionalizao

O Qt suporta unicode, idiomas no derivados


do Latin e escritos da direita para a esquerda
O Qt torna fcil traduzir todo um sistema de um
idioma para outro:

Envolva toda string visvel pelo usurio na macro tr()


Execute o comando lupdate para gerar o arquivo a ser
traduzido
Utilize o Qt Linguist para traduzir o arquivo
Execute o comando lrelease para gerar o arquivo
traduzido

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

164

Internacionalizao

Grande parte das aplicaes carrega o arquivo


de tradues no momento em que iniciada,
baseado nas configuraes de locale do
sistema
O Qt tambm possibilita a troca, em tempo de
execuo, do idioma utilizado pelo sistema
O Qt tambm permite a seleo de imagens
(cones, splashs etc) a depender do locale do
sistema

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

165

Lab20: Internacionalizao

Carregando a traduo ao iniciar a aplicao

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


2 {
3
QApplication app(argc, argv);
4
QTranslator appTranslator;
5
appTranslator.load("myapp_" + QLocale::system().name(),
6
qApp->applicationDirPath());
7
app.installTranslator(&appTranslator);
8
...
9
return app.exec();
10 }

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

166

Multithreading

O desenvolvimento de aplicaes
multithreading importante para um melhor
aproveitamento dos recursos da mquina e
melhorias em aspectos ligados a escalabilidade
e tempo de resposta
O Qt disponibiliza duas API's para
multithreading:

QThread e associados

QtConcurrent

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

167

Multithreading

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Definindo e criando uma nova thread


class MyThread : public QThread
{
Q_OBJECT
protected:
void run();
};
void MyThread::run()
{
...
}

MyThread t;
t.start(); // dettach

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

168

Multithreading

Desenvolvimento multithreading
frequentemente leva a condies de corrida
Class Qt para sincronizao de threads:

QMutex: lock mutualmente exclusivo


QReadWriteLock: lock que distingue entre acesso
para leitura e escrita
QSemaphore: generalizao do QMutex para
proteger mais de um recurso
QWaitCondition: acorda outras threads quando
uma condio atendida
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

169

Multithreading

Reentrncia e Thread-Safety:

Uma funo thread-safe pode ser chamada


simultaneamente de mltiplas threads, mesmo
quando as invocaes usam dados compartilhados,
pois todas as referncias aos dados
compartilhados so serializadas
Uma funo reentrante pode tambm ser chamada
simultaneamente de mltiplas threads, mas
somente se cada invocao usa seus prprios
dados

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

170

Multithreading

1
2
3
4
5
6
7
8
9
10
11
12

Classe reentrante porm no thread-safe


class Counter
{
public:
Counter() { n = 0; }
void increment() { ++n; }
void decrement() { --n; }
int value() const { return n; }
private:
int n;
};

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

171

Lab21: Sincronizando

1
2
3
4
5
6
7
8
9
10
11
12
13

Tornando a classe thread-safe


class Counter
{
public:
Counter() { n = 0; }
void increment() { QMutexLocker locker(&mutex); ++n; }
void decrement() { QMutexLocker locker(&mutex); --n; }
int value() const { QMutexLocker locker(&mutex); return n; }
private:
mutable QMutex mutex;
int n;
};

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

172

Lab22: QtConcurrent

1
2
3
4
5
6
7
8

Usando QtConcurrent

// Instantiate the objects and connect to the finished signal.


MyClass myObject;
QFutureWatcher<int> watcher;
connect(&watcher, SIGNAL(finished()),
&myObject, SLOT(handleFinished()));
// Start the computation.
QFuture<int> future = QtConcurrent::run(...);
watcher.setFuture(future);

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

173

Plugins

O que um plugin ?

uma biblioteca dinmica que implementa uma


interface particular, com o objetivo de prover
funcionalidades extras.; (C++ GUI Programming
with Qt4)
No requer que seja previamente compilada e
linkada aplicao

O Qt4 possui um conjunto prprio de interfaces


de plugins para domnios tais como:

Formato de imagens, drivers de banco de dados,


estilos de widgets, codificao de texto etc.
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

174

Plugins

possvel criar novos domnios de plugins,


especficos para uma aplicao em particular
O framework para plugins do Qt adiciona
recursos de convenincia e segurana classe
QLibrary
Para criar um plugin para os domnios j
existentes do Qt precisa-se implementar duas
classes:

Plugin Wrapper

Plugin Handler
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

175

Plugins

possvel criar novos domnios de plugins,


especficos para uma aplicao em particular
O framework para plugins do Qt adiciona
recursos de convenincia e segurana classe
QLibrary
Para criar um plugin para os domnios j
Classe factory
existentes do Qt precisa-se implementar
duas
para criao de
novos handlers
classes:

Plugin Wrapper

Plugin Handler
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

176

Plugins

possvel criar novos domnios de plugins,


especficos para uma aplicao em particular
O framework para plugins do Qt adiciona
recursos de convenincia e segurana classe
QLibrary
Para criar um plugin para os domnios j
Classe factory
existentes do Qt precisa-se implementar
duas
para criao de
novos handlers
classes:

Plugin Wrapper

Plugin Handler

Classe que
efetivamente
implementa a
funcionalidade

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

177

Plugins

Estas duas classes devero ser filhas de


classes disponibilizadas pelo Qt
Wrapper

QAccessibleBridgePlugin
QAccessiblePlugin
QIconEnginePlugin
QImageIOPlugin
QInputContextPlugin
QPictureFormatPlugin
QSqlDriverPlugin
QStylePlugin
QTextCodecPlugin

Handler

QAccessibleBridge
QAccessibleInterface
QIconEngine
QImageIOHandler
QInputContext
QSqlDriver
QStyle
QTextCodec

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

178

Plugins

Os plugins para os domnios do Qt so


invocados pelos prprios objetos do Qt (ex:
QImageReader, QImageWriter)
Plugins instalados globalmente devem estar
localizados no diretrio $QTDIR/plugins/
Plugins instalados localmente devem estar no
subdiretrio plugins/ do diretrio que contm o
executvel da aplicao

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

179

Plugins

A arquitetura de plugins do Qt uma


abordagem interessante para a extenso
facilitada de aplicaes em C++
As classes QLibrary e QPluginLoader do Qt
realizam o processo de carga dinmica de
novas classes
Se as interfaces dos plugins forem bem
projetadas, pode-se estender aplicaes sem
requerer novas recompilaes
Alternativas: QtScript, Kross ...
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

180

Lab23: Plugins

Definio de uma interface da aplicao

Implementao de dois plugins

Carga dos plugins no incio da aplicao

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

181

Lab24: Qt Mobile

O NOKIA Qt SDK torna o processo


substancialmente mais fcil
API's especficas para mobile

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

182

Concluso

Crescente expanso do Qt na indstria

O Qt est cada dia mais open source

O KDE melhora o Qt ainda mais

Programas:

Qt in Education

NOKIA Qt Certification

Qt Dev Days

Akademy

Akademy-BR
Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

183

FIM
Desenvolvimento
Cross-Platform com C++ e Qt
Sandro Santos Andrade
sandroandrade@kde.org

Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue

184

Você também pode gostar