Baixe o app para aproveitar ainda mais
Prévia do material em texto
Desenvolvimento Cross-Platform com C++ e Qt Sandro Santos Andrade sandroandrade@kde.org http://liveblue.wordpress.com Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 2 Objetivos ● Apresentar as principais funcionalidades do Qt 4.6 utilizadas no desenvolvimento produtivo de aplicações cross-platform modernas ● Proporcionar uma vivência prática inicial das soluções mais utilizadas neste toolkit motivando a formação de novos desenvolvedores Qt / KDE ● Discutir decisões de projeto, idiomas e ferramentas auxiliares utilizados no Qt Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 3 Pré-requisitos ● Necessários: ● Fundamentos de Orientação a Objetos (OO) ● Experiência com alguma linguagem OO ● Experiência com desenvolvimento de aplicações visuais ● Desejáveis: ● Fundamentos da linguagem Standard C++ ● Especiais: ● Padrões de projeto, estilos arquiteturais, application frameworks etc Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 4 Metodologia ● Duração: 60 horas ● Tópicos expositivos e laboratórios práticos ● Referências: ● Livros ● Qt Reference Documentation ● Fóruns (QtCentre etc) ● Qt Quarterly Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 5 Metodologia ● Duração: 60 horas ● Tópicos expositivos e laboratórios práticos ● Referências: ● Livros ● Qt Reference Documentation ● Fóruns (QtCentre etc) ● Qt Quarterly Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 6 Sobre o instrutor ● Sandro Andrade – Doutorando pelo DMCC (UFBa) – Nove anos de experiência com desenvolvimento em Qt e treze anos com C++ – Dez anos de experiência 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 7 Visão Geral ● O Qt é um toolkit para desenvolvimento de aplicações cross-platform com recursos para IPC, networking, XML, SVG, banco de dados, scripting, OpenGL, animações, multi-touch, reconhecimento de gestos, multimídia e soluções mobile ● Disponível publicamente desde maio de 1995 ● Possui mais de 800 classes e 9000 funções ● Utilizado em mais de 70 empresas de ponta ● Possui licença dual (LGPL e comercial) Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 8 Histórico dos Toolkits Gráficos ● X11 ● Motif ● Tcl / Tk ● Fltk ● WxWidgets ● MFC / AWT / Swing ● GTK / Qt Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 9 Visão Geral ● Módulos e ferramentas Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 10 Visão Geral ● Widgets Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 11 Visão Geral ● Dialogs e Main Windows Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 12 Visão Geral ● Dialogs e Main Windows Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 13 Visão Geral ● Dialogs e Main Windows Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 14 Visão Geral ● Gráficos 2D Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 15 Visão Geral ● Gráficos 2D Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 16 Visão Geral ● Gráficos 2D Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 17 Visão Geral ● Gráficos 2D Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 18 Visão Geral ● OpenGL Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 19 Visão Geral ● OpenGL Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 20 Visão Geral ● OpenGL Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 21 Visão Geral ● Scripting Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 22 Visão Geral ● Interfaces animadas Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 23 Visão Geral ● Model View Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 24 Visão Geral ● Banco de Dados Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 25 Visão Geral ● Networking Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 26 Visão Geral ● XML Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 27 Visão Geral ● Ferramentas (Qt Designer) Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 28 Visão Geral ● Ferramentas (Qt Linguist) Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 29 Visão Geral ● Ferramentas (Qt Assistant) Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 30 Visão Geral ● Qt Mobile Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 31 Visão Geral ● Qt Mobile Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 32 Visão Geral ● Qt Mobile Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 33 História do Qt ● Primeira versão disponibilizada em 1995, por Haavard Nord e Eirik Chambe-Eng ● Seu desenvolvimento se iniciou em 1991 e em 1993 já existia um núcleo 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 34 História do Qt ● Em 1996 foi lançado o Qt 1.1 e a Trolltech tinha 8 clientes ● Também 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 35 História do Qt ● Em 1997 o Qt passa a ser utilizado no desenvolvimento do KDE e a versão 1.3 é lançada ● Em 1999, o Qt2 passa a ser licenciado pela QPL (Qt Public License) ● Em 2000 é lançado 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 36 História do Qt ● Em 2001 é lançado o Qt3 ● Em 2005 é lançado o Qt4: primeira versão 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 37 História do Qt ● Em 2009 o Qt passa a ser liberado sob a licença LGPL e seus repositórios se tornam abertos a contribuições 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 38 Porque o Qt ? ● Quem usa o Qt ? Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 39 Instalando o Qt 4.6 ● Linux: ● Via compilação dos fontes obtidos em qt.nokia.com ou qt.gitorious.org ● Via binários disponibilizados através de pacotes para a sua distribuição ● Geralmente existem pacotes separados para: – Bibliotecas e headers – Ferramentas (Designer, Linguist e Assistant) – Demos – Documentação – Qt Creator (IDE) Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 40 Instalando o Qt 4.6 ● Windows: ● Fazer o download do Qt SDK para Windows ● Executar o programade instalação ● O programa de instalação irá fazer o download do MinGW (Minimalist GNU for Windows) ● Pode ser utilizado com o Microsoft Visual C++ ou Eclipse, além do Qt Creator Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 41 Lab1: Hello Qt 1 #include <QApplication> 2 #include <QLabel> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication app(argc, argv); 7 QLabel *label = new QLabel("Hello Qt!"); 8 label->show(); 9 return app.exec(); 10 } ● Executar: $ qmake -project $ qmake $ make Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 42 Lab1: Hello Qt ● O qmake: ● Ferramenta que automatiza o processo de compilação, linking e instalação em diferentes plataformas ● Realiza a geração automática de Makefiles a partir de arquivos de projeto de fácil criação ● O arquivo de projeto pode ser criado pelo desenvolvedor ou automaticamente pelo qmake (opção -project) ● Os módulos QtCore e QtGui são automaticamente incluídos no processo de linking Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 43 Lab1: Hello Qt ● O qmake: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 44 Lab1: Hello Qt 1 ################################################################### 2 # Automatically generated by qmake (2.01a) qua jul 21 22:43:25 2010 3 ################################################################### 4 5 TEMPLATE = app 6 TARGET = 7 DEPENDPATH += . 8 INCLUDEPATH += . 9 10 # Input 11 SOURCES += main.cpp ● O qmake: ● Arquivo de projeto automaticamente gerado neste exemplo Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 45 Lab1: Hello Qt ● O qmake - principais configurações: – Controlando a informação de debug: CONFIG += qt [ debug | release | debug_and_release ] – Inclusões dependentes de plataforma: win32 { SOURCES += hellowin.cpp } unix { SOURCES += hellounix.cpp } – Tipos de template: ● app = programa executável ● lib = biblioteca. CONFIG pode conter dll, staticlib ou plugin ● subdirs = união de todos os projetos dos diretórios em SUBDIRS – Plugins: adicione plugin à variável CONFIG – Plugin do Qt Designer: adicione plugin e designer à variável CONFIG Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 46 Lab1: Hello Qt ● O qmake - principais configurações: – Adicionando e removendo módulos 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 47 Lab1: Hello Qt ● Algumas considerações: ● 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 são criados ocultos Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 48 Lab1: Hello Qt ● Algumas considerações: ● O Qt tem sido cada vez mais utilizado no desenvolvimento de aplicações console (sem interface gráfica), devido às grandes facilidades adicionadas pelo seu modelo de objetos ● Nestes casos não é necessário realizar o link com o módulo QtGui e deve-se adicionar a instrução “QT -= gui” no arquivo de configuração do qmake ● Tais aplicações devem utilizar a classe QCoreApplication on invés de QApplication Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 49 Modelo de Objetos do Qt ● O Qt estende o modelo de objetos do C++ com as seguintes funcionalidades: ● Signals / Slots: mecanismo desacoplado para comunicação (um-muitos) entre objetos ● Object properties: atributos dinâmicos ● Meta-Objects: para operações RTTI (Run-Time Type Information) e de Introspecção ● Eventos e filtros de eventos ● Tradução contextual de strings para internacionalização Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 50 Signals / Slots ● Representam um mecanismo central do Qt ● Signals e slots são por padrão processados imediatamente no momento da sua execução ● Um signal é uma mensagem que está presente em uma classe como uma declaração de uma função-membro void. Signals não são invocados, mas emitidos (via emit) por um objeto da classe ● Um slot é uma função-membro void e pode ser normalmente invocada Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 51 Signals / Slots 1 bool QObject::connect(senderqobjptr, 2 SIGNAL(signalname(argtypelist)), 3 receiverqobjptr, 4 SLOT(slotname(argtypelist)) 5 optionalConnectionType); ● Um signal de um objeto pode ser conectado a slots de um ou mais outros objetos, desde que os parâmetros sejam compatíveis ● Sintaxe de conexão: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 52 Signals / Slots Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 53 Lab2: Signals / Slots 1 #include <QObject> 2 3 class Counter : public QObject 4 { 5 Q_OBJECT 6 public: 7 Counter() { m_value = 0; } 8 int value() const { return m_value; } 9 public slots: 10 void setValue(int value); 11 signals: 12 void valueChanged(int newValue); 13 private: 14 int m_value; 15 }; ● Um exemplo simples: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 54 Lab2: Signals / Slots 1 void Counter::setValue(int value) 2 { 3 if (value != m_value) { 4 m_value = value; 5 emit valueChanged(value); 6 } 7 } 8 9 10 Counter a, b; 11 QObject::connect(&a, SIGNAL(valueChanged(int)), 12 &b, SLOT(setValue(int))); 13 14 a.setValue(12); // a.value() == 12, b.value() == 12 15 b.setValue(48); // a.value() == 12, b.value() == 48 ● Um exemplo simples: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 55 Lab2: Signals / Slots ● Considerações importantes: ● Slots são funções comuns do C++: podem ser invocadas diretamente, sobrecarregadas, públicas ou privadas ● Um signal pode ser conectado a vários 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 56 Lab2: Signals / Slots ● Considerações importantes: ● Conexões podem ser removidas com QObject::disconnect ● Um signal pode ter um número de parâmetros maior ou igual ao número de parâmetros do slot conectado ● Signals e slots podem ser utilizados em qualquer classe derivada de QObject, não somente widgets Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 57 Lab2: Signals / Slots ● Considerações importantes: ● Conexões, 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 58 Signals / Slots ● Como signals e slots são implementados ? ● As palavras reservadas signals, slots e emit (bem como foreach e recursos de meta-objetos, propriedades etc) não estão presentes no Standard C++ ● Essas extensões são tratadas pelo MOC (Meta- Object Compiler) ● O qmake verifica quais classes, declaradas na variável HEADER, utilizam a macro Q_OBJECT e automaticamente inclui a invocação do moc no arquivos Makefile gerados Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 59 Signals / Slots● Como signals e slots são implementados ? ● O MOC (Meta-Object Compiler) Código com extensões do Qt Ex: Q_OBJECT public slots: MOC (Meta-Object Compiler) Código Standard C++ 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 relação de parentesco com outro widget ● Exemplo: 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 relação de parentesco com outro widget ● Exemplo: QWidget (top-level window) 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 relação 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 63 Layout e Parentesco ● Layouts gerenciam a geometria dos widgets de uma janela ● Um widget pode ter uma relação de parentesco com outro widget ● Exemplo: QWidget (top-level window) QSlider (filho do QWidget) QSpinBox (filho do QWidget) Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 64 Layout e Parentesco ● Tipos de layout: – QHBoxLayout – QVBoxLayout QGridLayout QformLayout – Layouts dinâmicos e em fluxo Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 65 Layout e Parentesco ● Conexão de signals e slots Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 66 Lab3: Layout e Parentesco 15 QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); 19 QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int))); 20 spinBox->setValue(35); 21 QHBoxLayout *layout = new QHBoxLayout; 22 layout->addWidget(spinBox); 23 layout->addWidget(slider); 24 window->setLayout(layout); 25 window->show(); 26 return app.exec(); 27 } 1 #include <QApplication> 2 #include <QHBoxLayout> 3 #include <QSlider> 4 #include <QSpinBox> 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); Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 67 Lab3: Layout e Parentesco ● Considerações sobre relações de parentesco: – O pai automaticamente assume a responsabilidade de liberação de memória de todos os filhos – Os filhos são liberados quando o pai sair do escopo – Os únicos objetos a serem deletados manualmente são os criados com new e que não possuem pai – Se um filho é deletado antes do pai ele é automaticamente excluído da lista de filhos do pai – Widgets filhos são vistos dentro da área do pai – A execução do show() no pai automaticamente exibe todos os filhos Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 68 Lab3: Layout e Parentesco ● Hierarquia das classes utilizadas: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 69 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/en- us/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 70 Qt Reference Documentation ● http://doc.qt.nokia.com/4.6/ Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 71 Main Windows e Dialogs ● Uma aplicação é geralmente formada por uma tela principal (QMainWindow) e por várias outras telas (QDialog) ● Essas telas podem ser criadas manualmente ou através do Qt Designer ● Exemplo (Dialog): Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 72 Main Windows e Dialogs ● Layout e relações de parentesco: 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 Main Windows e Dialogs ● Dialogs pré-existentes no Qt: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 75 Lab4: Dialogs 15 void findPrevious( const QString &str, Qt::CaseSensitivity cs); 16 private slots: 17 void findClicked(); 18 void enableFindButton( const QString &text); 19 private: 20 QLabel *label; 21 QLineEdit *lineEdit; 22 QCheckBox *caseCheckBox; 23 QCheckBox *backwardCheckBox; 24 QPushButton *findButton; 25 QPushButton *closeButton; 26 }; 1 #include <QDialog> 2 3 class QCheckBox; 4 class QLabel; 5 class QLineEdit; 6 class QPushButton; 7 8 class FindDialog : public QDialog 9 { 10 Q_OBJECT 11 public: 12 FindDialog (QWidget *parent = 0); 13 signals: 14 void findNext( const QString &str, Qt::CaseSensitivity cs); Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 76 Lab4: Dialogs 15 findButton->setDefault(true); 16 findButton->setEnabled(false); 17 18 closeButton = new QPushButton(tr("Close")); 19 20 connect(lineEdit, SIGNAL(textChanged( const QString &)), this, SLOT(enableFindButton( const QString &))); 21 22 connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked())); 23 24 connect(closeButton, SIGNAL(clicked()), 25 this, SLOT(close())); 1 #include <QtGui> 2 #include "finddialog.h" 3 4 FindDialog::FindDialog( QWidget *parent) : QDialog(parent) 5 { 6 label = new QLabel( tr("Find &what:")); 7 lineEdit = new QLineEdit; 8 label->setBuddy(lineEdit); 9 10 caseCheckBox = new QCheckBox(tr("Match &case")); 11 12 backwardCheckBox = new QCheckBox( tr("Search &backward")); 13 14 findButton = new QPushButton(tr("&Find")); Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 77 Lab4: Dialogs 39 QHBoxLayout *mainLayout = new QHBoxLayout; 40 mainLayout->addLayout( leftLayout); 41 mainLayout->addLayout( rightLayout); 42 setLayout(mainLayout); 43 44 setWindowTitle(tr("Find")); 45 46 setFixedHeight( sizeHint().height()); 47 } 26 QHBoxLayout *topLeftLayout = new QHBoxLayout; 27 topLeftLayout->addWidget(label); 28 topLeftLayout->addWidget( lineEdit); 29 30 QVBoxLayout *leftLayout = new QVBoxLayout; 31 leftLayout>addLayout( topLeftLayout); 32 leftLayout->addWidget( caseCheckBox); 33 leftLayout->addWidget( backwardCheckBox); 34 35 QVBoxLayout *rightLayout = new QVBoxLayout; 36 rightLayout->addWidget( findButton); 37 rightLayout->addWidget( closeButton); 38 rightLayout->addStretch(); Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 78 Main Windows e Dialogs ● Main Windows são widgets que podem conter menus, toolbars e barra de status ● Main Windows são criadas através da derivação da classe QMainWindow ● O Qt Designer facilita sobremaneira a criação de Main Windows e Dialogs Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 79 Main Windows e Dialogs ● Áreas definidas pela QMainWindow Desenvolvimento Cross-Platform com C++ e Qt - Sandro SantosAndrade - Live Blue 80 Main Windows e Dialogs ● Menus e toolbars baseiam-se no conceito de action: ● Um action é um item que pode ser adicionado a qualquer número de menus e toolbars ● Criar menus e toolbars requer três passos: ● Criação e configuração dos actions ● Criação do menu e utilização dos actions ● Criação das toolbars e utilização dos actions ● Todo action possui o signal triggered() Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 81 Lab5: Main Windows 1 QAction *newAction = new QAction(tr("&New"), this); 2 newAction->setIcon(QIcon(":/images/new.png")); 3 newAction->setShortcut(tr("Ctrl+N")); 4 newAction->setStatusTip(tr("Create a new spreadsheet file")); 5 connect(newAction, SIGNAL(triggered()), this, SLOT(newFile())); ● Criando um action: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 82 Lab5: Main Windows 1 QMenu *fileMenu = menuBar()->addMenu(tr("&File")); 2 fileMenu->addAction(newAction); 3 fileMenu->addAction(openAction); 4 fileMenu->addAction(saveAction); 5 fileMenu->addAction(saveAsAction); ● Inserindo actions em menus Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 83 Lab5: Main Windows 1 QToolBar *fileToolBar = addToolBar(tr("&File")); 2 fileToolBar->addAction(newAction); 3 fileToolBar->addAction(openAction); 4 fileToolBar->addAction(saveAction); 5 QToolBar *editToolBar = addToolBar(tr("&Edit")); 6 editToolBar->addAction(cutAction); 7 editToolBar->addSeparator(); 8 editToolBar->addAction(findAction); ● Inserindo actions em toolbars Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 84 Lab5: Main Windows 1 QLabel *locationLabel = new QLabel(" W999 "); 2 QLabel *formulaLabel = new QLabel; 3 statusBar()->addWidget(locationLabel); 4 statusBar()->addWidget(formulaLabel, 1); 5 connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)), 6 this, SLOT(updateStatusBar())); 7 connect(spreadsheet, SIGNAL(modified()), 8 this, SLOT(spreadsheetModified())); 9 updateStatusBar(); ● Criando a barra de status Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 85 Lab5: Main Windows 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; ● Usando um message box Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 86 Main Windows e Dialogs ● As imagens utilizadas pela aplicação (ícones etc) podem ser carregadas de três formas: ● Através da leitura, em tempo de execução, dos arquivos das imagens ● Através da inclusão de imagens XPM no código- fonte ● Através do uso do mecanismo de resources do Qt Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 87 Main Windows e Dialogs ● Resources: ● O arquivo de recursos de uma aplicação Qt indica quais arquivos serão diretamente incluídos no executável a ser gerado. Dessa forma, ícones não são perdidos ● Na verdade, qualquer tipo de arquivo (não somente imagens) pode ser incluído no executável ● Arquivos de recursos podem ser organizados em categorias ● Recursos são utilizados com o prefixo “:/” Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 88 Lab6: Resources ● Utilizando resources ao invés 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 89 Main Windows e Dialogs Descrição XML do dialog ou mainwindow (arquivo .ui) UIC (User Interface Compiler) Código Standard C++ (classe no namespace Ui) ● Entendendo o Qt Designer Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 90 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 recém-criada ● Isso garante a separação entre o código gerado pelo Qt Designer e o código que implementa a funcionalidade Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 91 Lab7: Funcionalidades 1 #include <QDialog> 2 #include "ui_cdmainwindow.h" 3 4 class CdMainWindow : public QMainWindow, public Ui::CdMainWindow 5 { 6 Q_OBJECT 7 public: 8 CdMainWindow(QWidget *parent = 0); 9 private slots: 10 void on_lineEdit_textChanged(); 11 }; ● Implementando funcionalidade Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 92 Lab7: Funcionalidades 1 #include <QtGui> 2 #include "cdmainwindow.h" 3 4 CdMainWindow::CdMainWindow(QWidget *parent) : QmainWindow(parent) 5 { 6 setupUi(this); 7 QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}"); 8 lineEdit->setValidator(new QRegExpValidator(regExp, this)); 9 } 10 11 void CdMainWindow::on_lineEdit_textChanged() 12 { 13 okButton->setEnabled(lineEdit->hasAcceptableInput()); 14 } ● Implementando funcionalidade Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 93 Lab7: Funcionalidades 1 #include <QApplication> 2 #include "cdmainwindow.h" 3 int main(int argc, char *argv[]) 4 { 5 QApplication app(argc, argv); 6 CdMainWindow *mw = new CdMainWindow; 7 mw->show(); 8 return app.exec(); 9 } ● Implementando funcionalidade Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 94 Lab7: Funcionalidades 1 MainWindow::MainWindow(...) 2 { 3 ... 4 findDialog = 0; 5 ... 6 } 7 8 void MainWindow::on_findAction_triggered() 9 { 10 if (!findDialog) 11 { 12 findDialog = new FindDialog(this); 13 } 14 findDialog->show(); 15 findDialog->activateWindow(); 16 } ● Usando modeless dialogs Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 95 Lab7: Funcionalidades 1 void MainWindow::addCd() 2 { 3 AddCdDialog addCdDialog(this); 4 if (addCdDialog.exec()) 5 { 6 // Retorna QDialog::Accepted ou QDialog::Reject 7 ... 8 } 9 } ● Usando modal dialogs Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 96 Lab8: Aplicações MDI ● Aplicações MDI (Multiple Document Interface) ● Criadas utilizando uma instância de QMdiArea como centralWidget de uma Main Window ● Novas janelas são adicionadas usando addSubWindow() Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 97 Main Windows e Dialogs ● Size policies: especificam como o widget será alterado pelo layout manager: ● Fixed: o widget não pode aumentar ou diminuir. Será sempre mantido no seu tamanho atual ● Minimum: o tamanho atual é o tamanho mínimo do widget ● Maximum: o tamanho atual é o tamanho máximo 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 98 Main Windows e Dialogs ● Size policies Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 99 Criando Novos Widgets ● Novos widgets podem ser criados herdando a classe QWidget e reimplementando a função paint() ● A função paint() é automaticamente chamada sempre que o widget precisa ser (re) desenhado ● As funções de desenho estão concentradas na classe QPainter ● O QPainter suporta operações derotação, translação e escala Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 100 Criando Novos Widgets ● Sistema de painting Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 101 Lab9: Widget Relógio 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 102 Lab9: Widget Relógio 1 QPainter painter(this); 2 painter.setRenderHint(QPainter::Antialiasing); 3 painter.translate(width() / 2, height() / 2); 4 painter.scale(side / 200.0, side / 200.0); 5 6 painter.setPen(Qt::NoPen); 7 painter.setBrush(hourColor); 8 9 painter.save(); 10 painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); 11 painter.drawConvexPolygon(hourHand, 3); 12 painter.restore(); 13 14 painter.setPen(hourColor); 15 16 for (int i = 0; i < 12; ++i) { 17 painter.drawLine(88, 0, 96, 0); 18 painter.rotate(30.0); 19 } Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 103 Lab9: Widget Relógio 1 painter.setPen(Qt::NoPen); 2 painter.setBrush(minuteColor); 3 4 painter.save(); 5 painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); 6 painter.drawConvexPolygon(minuteHand, 3); 7 painter.restore(); 8 9 painter.setPen(minuteColor); 10 11 for (int j = 0; j < 60; ++j) { 12 if ((j % 5) != 0) 13 painter.drawLine(92, 0, 96, 0); 14 painter.rotate(6.0); 15 } 16 } Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 104 Model View ● Muitas aplicações permitem a busca, visualização e edição de itens individuais de um conjunto de dados ● Em versões anteriores do Qt, os widgets eram populados com todo o conteúdo do conjunto de dados, estes eram alterados e posteriormente atualizados na sua origem ● Entretanto, esta abordagem não é escalável para grandes conjuntos e não resolve o problema da visualização do mesmo conjunto ou dois ou mais widgets diferentes Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 105 Model View ● O Qt4 usa o padrão Model View, uma variação do model-view-controller, para resolver esses problemas: – Model: representa o conjunto de dados e é responsável pela aquisição e atualização de dados a partir da origem. Cada tipo de dados tem seu próprio modelo, porém a API provida pelos modelos aos views é padrão – View: apresenta os dados para o usuário. Para grandes conjuntos, exibe somente o necessário (lazy-load) – Controller: mediador entre o usuário e o view. Converte ações do usuário em requisições para navegar e editar dados, os quais são enviados pelo view para o model Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 106 Model View ● Qt4 Model View Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 107 Model View ● Qt4 Model View ● O delegate é usado para ter total controle sobre como os itens são apresentados e editados ● O Qt disponibiliza um delegate padrão para cada tipo de view ● Os modelos podem obter somente os dados que são realmente necessários ● 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 108 Model View ● Os widgets são 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 109 Model View ● Modelos predefinidos do Qt: – QStringListModel: armazena uma lista de strings – QStandardItemModel: armazena dados hierárquicos arbitrários – 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 110 Lab10: Model View 1 QFileSystemModel *model = new QFileSystemModel; 2 model->setRootPath(QDir::currentPath()); 3 4 QTreeView *tree = new QTreeView(splitter); 5 tree->setModel(model); 6 tree->setRootIndex(model->index(QDir::currentPath())); 7 8 QListView *list = new QListView(splitter); 9 list->setModel(model); 10 list->setRootIndex(model->index(QDir::currentPath())); ● Visualizando o sistema de arquivos Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 111 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 112 Lab11: Delegates 1 class SpinBoxDelegate : public QItemDelegate 2 { 3 Q_OBJECT 4 public: 5 SpinBoxDelegate(QObject *parent = 0); 6 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 }; ● Utilizando outros delegates Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 113 Lab11: Delegates 1 QWidget *SpinBoxDelegate::createEditor(QWidget *parent, 2 const QStyleOptionViewItem &/* option */, 3 const QModelIndex &/* index */) const 4 { 5 QSpinBox *editor = new QSpinBox(parent); 6 editor->setMinimum(0); 7 editor->setMaximum(100); 8 9 return editor; 10 } 11 12 void SpinBoxDelegate::setEditorData(QWidget *editor, 13 const QModelIndex &index) const 14 { 15 int value = index.model()->data(index, Qt::EditRole).toInt(); 16 QSpinBox *spinBox = static_cast<QSpinBox*>(editor); 17 spinBox->setValue(value); 18 } ● Utilizando outros delegates Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 114 Lab11: Delegates 1 void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, 2 const QModelIndex &index) const 3 { 4 QSpinBox *spinBox = static_cast<QSpinBox*>(editor); 5 spinBox->interpretText(); 6 int value = spinBox->value(); 7 model->setData(index, value, Qt::EditRole); 8 } 9 10 void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, 11 const QStyleOptionViewItem &option, const QModelIndex &/* index */) const 12 { 13 editor->setGeometry(option.rect); 14 } ● Utilizando outros delegates Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 115 Generic Containers ● Classes template de propósito geral para armazenamento de outros objetos ● São implicitamente compartilhados, reentrantes, com bom desempenho e baixo consumo de memória e são thread-safe se utilizados somente de forma read-only ● Possuem dois tipos de iterators: ● Java-style: fáceis de usar ● STL-style: ligeiramente mais eficientes ● Foreach Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 116 Generic Containers● São implicitamente compartilhados ● Podem ser serializados com o QDataStream ● Resultam em menos código executável que os correspondentes STL ● Containers sequenciais: QList, QLinkedList, QVector, QStack e QQueue ● Containers associativos: QMap, QMultiMap, QHash, QMultiHash e QSet ● Algoritmos genéricos. Ex: qSort(), qBinaryFind(), qSwap() Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 117 Generic Containers ● Visão Geral: – QList: ● Implementada usando arrays, acesso rápido por índices, expansão mínima de código no executável – QLinkedList: ● Implementada como lista encadeada, melhor desempenho para inserções no meio, melhor semântica de iterators – QVector: ● Implementado usando arrays, inserções no início e no meio são custosas – QStack: ● Sub-classe conveniente de QVector com semântica LIFO Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 118 Generic Containers ● Visão Geral: – QQueue: ● Sub-classe conveniente de QList com semântica FIFO – QSet: ● Representa conjuntos matemática com acessos rápidos – Q[Multi]Map: ● Dicionário que mapeia chaves em valores, armazena os dados ordenados pela chave – Q[Multi]Hash: ● Armazena os dados em ordem arbitrário, acesso mais rápido que o Q[Multi]Map Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 119 Generic Containers ● Iterators Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 120 Generic Containers 1 QList<QString> list; 2 list << "A" << "B" << "C" << "D"; 3 4 QListIterator<QString> i(list); 5 while (i.hasNext()) 6 qDebug() << i.next(); 7 8 9 QListIterator<QString> i(list); 10 i.toBack(); 11 while (i.hasPrevious()) 12 qDebug() << i.previous(); ● Iterators Java-style Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 121 Generic Containers 1 QMutableListIterator<int> i(list); 2 while (i.hasNext()) { 3 if (i.next() % 2 != 0) 4 i.remove(); 5 } 6 7 8 QMutableListIterator<int> i(list); 9 while (i.hasNext()) { 10 if (i.next() > 128) 11 i.setValue(128); 12 } ● Iterators com suporte a modificações Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 122 Generic Containers 1 QList<QString> list; 2 list << "A" << "B" << "C" << "D"; 3 4 QList<QString>::iterator i; 5 for (i = list.begin(); i != list.end(); ++i) 6 *i = (*i).toLower(); ● Iterators STL-style Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 123 Generic Containers 1 QLinkedList<QString> list; 2 foreach (QString str, list) { 3 if (str.isEmpty()) 4 break; 5 qDebug() << str; 6 } 7 8 QMap<QString, int> map; 9 foreach (QString str, map.keys()) 10 qDebug() << str << ":" << map.value(str); 11 12 QMultiMap<QString, int> map; 13 foreach (QString str, map.uniqueKeys()) { 14 foreach (int i, map.values(str)) 15 qDebug() << str << ":" << i; 16 } ● Foreach Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 124 Generic Containers ● Complexidades: Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 125 Entrada e Saida (E/S) ● O Qt disponibiliza duas classes principais para operações de entrada e saida: ● QTextStream: entrada e saida de dados texto ● QDataStream: entrada e saida de dados binários Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 126 Entrada e Saida (E/S) 1 QFile data("output.txt"); 2 if (data.open(QFile::WriteOnly | QFile::Truncate)) { 3 QTextStream out(&data); 4 out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7; 5 // writes "Result: 3.14 2.7 " 6 } 7 8 9 QTextStream in("0x50 0x20"); 10 int firstNumber, secondNumber; 11 12 in >> firstNumber; // firstNumber == 80 13 in >> dec >> secondNumber; // secondNumber == 0 14 15 char ch; 16 in >> ch; // ch == 'x' ● Gravando e recuperando dados texto Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 127 Entrada e Saida (E/S) ● Manipuladores Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 128 Entrada e Saida (E/S) 1 QFile file("file.dat"); 2 file.open(QIODevice::WriteOnly); 3 QDataStream out(&file); // we will serialize the data into the file 4 out << QString("the answer is"); // serialize a string 5 out << (qint32)42; // serialize an integer 6 7 8 QFile file("file.dat"); 9 file.open(QIODevice::ReadOnly); 10 QDataStream in(&file); // read the data serialized from the file 11 QString str; 12 qint32 a; 13 in >> str >> a; // extract "the answer is" and 42 ● Gravando e recuperando dados binário Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 129 Entrada e Saida (E/S) 1 QDataStream &operator<<(QDataStream &, const QXxx &); 2 QDataStream &operator>>(QDataStream &, QXxx &); ● Uma série de classes Qt já suportam entrada e saida via QDataStream, inclusive os containers ● Pode-se adicionar este suporte em novas classes através da implementação dos operadores << e >> Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 130 Lab12: Containers e E/S ● Containers aninhados ● Gravação e recuperação usando QDataStream Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 131 Banco de Dados ● O módulo 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 conexão de banco é representada por uma instância da classe QSqlDatabase Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 132 Banco de Dados ● Drivers disponíveis: – 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 133 Banco de Dados ● O banco pode ser utilizado de duas formas: ● Com a classe QSqlQuery é possível a execução direta de sentenças SQL ● Com classes de mais alto nível como QSqlTableModel e QsqlRelationalTableModel ● As classes de mais alto nível podem ser anexadas a widgets para visualização automática dos dados do banco ● O Qt torna fácil a programação de recursos como master-detail e drill-down Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 134 Banco de Dados 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 } ● Criando a conexão default Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 135 Banco de Dados 1 QSqlQuery query; 2 query.exec("SELECT title, year FROM cd WHERE year >= 1998"); 3 while (query.next()) 4 { 5 QString title = query.value(0).toString(); 6 int year = query.value(1).toInt(); 7 qDebug() << title << ": " << year << endl; 8 } ● Executando sentenças SQL Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 136 Banco de Dados 1 QSqlQuery query; 2 3 query.exec("CREATE TABLE artist (id INTEGER PRIMARY KEY, " 4 "name VARCHAR(40) NOT NULL, country VARCHAR(40))"); 5 6 query.exec("CREATE TABLE cd (id INTEGER PRIMARY KEY, " 7 "title VARCHAR(40) NOT NULL, artistid INTEGER NOT NULL, " 8 "year INTEGER NOT NULL, " 9 "FOREIGN KEY (artistid) REFERENCES artist)"); 10 11 query.exec("CREATE TABLE track (id INTEGER PRIMARYKEY, " 12 "title VARCHAR(40) NOT NULL, duration INTEGER NOT NULL, " 13 "cdid INTEGER NOT NULL)"); ● QSqlQuery pode ser utilizado com comandos DDL e inserts Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 137 Banco de Dados 1 QSqlTableModel model; 2 model.setTable("cd"); 3 model.setFilter("year >= 1998"); 4 model.select(); 5 connect(model, SIGNAL(beforeInsert(QSqlRecord &)), 6 this, SLOT(beforeInsertArtist(QSqlRecord &))); 7 for (int i = 0; i < model.rowCount(); ++i) 8 { 9 QSqlRecord record = model.record(i); 10 QString title = record.value("title").toString(); 11 int year = record.value("year").toInt(); 12 qDebug() << title << ": " << year << endl; 13 } ● Consultando com QSqlTableModel Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 138 Banco de Dados 1 model = new QSqlTableModel(this); 2 model->setTable("artist"); 3 model->setSort(Artist_Name, Qt::AscendingOrder); 4 model->setHeaderData(Artist_Id, Qt::Horizontal, tr("Id")); 5 model->setHeaderData(Artist_Name, Qt::Horizontal, tr("Name")); 6 model->setHeaderData(Artist_Country, Qt::Horizontal, tr("Country")); 7 model->select(); 8 artistTableView = new QTableView; 9 artistTableView->setModel(model); 10 artistTableView->setSelectionBehavior(QAbstractItemView::SelectRows); 11 artistTableView->resizeColumnsToContents(); ● Ligando o model a uma view Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 139 Banco de Dados 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 } ● Incluindo registros Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 140 Banco de Dados 1 inline int generateId(const QString &table) 2 { 3 QSqlQuery query; 4 query.exec("SELECT MAX(id) FROM " + table); 5 int id = 0; 6 if (query.next()) 7 id = query.value(0).toInt() + 1; 8 return id; 9 } ● Incluindo registros Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 141 Banco de Dados 1 tableView->setFocus(); 2 QModelIndex index = tableView->currentIndex(); 3 if (!index.isValid()) return; 4 QSqlRecord record = model->record(index.row()); 5 QSqlTableModel cdModel; 6 cdModel.setTable("cd"); 7 cdModel.setFilter("artistid = " + record.value("id").toString()); 8 cdModel.select(); 9 if (cdModel.rowCount() == 0) { 10 model->removeRow(tableView->currentIndex().row()); 11 } else { 12 QMessageBox::information(this, 13 tr("Delete Artist"), 14 tr("Cannot delete %1 because there are CDs associated " 15 "with this artist in the collection.") 16 .arg(record.value("name").toString())); 17 } ● Excluindo registros Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 142 Lab13: Banco de Dados ● Uso da classe QSqlQuery ● Integração com o Model View ● Inclusão e Exclusão Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 143 Banco de Dados 1 connect(cdTableView->selectionModel(), 2 SIGNAL(currentRowChanged(const QModelIndex &, 3 const QModelIndex &)), 4 this, 5 SLOT(currentCdChanged(const QModelIndex &))); ● Relacionamentos e master-detail – 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 Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 144 Lab14: Master-Detail ● Configuração da base de dados ● QSqlRelationalTableModel ● QSqlTableModel Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 145 Graphics View ● Promove o gerenciamento de uma grande quantidade de itens gráficos 2D e disponibiliza um widget para visualização destes itens com suporte a zomming e rotação ● Surgiu no Qt 4.2 substituindo o QCanvas ● Promove uma abordagem baseada em itens para o estilo Model View ● Várias views podem observar uma cena e uma cena contém itens de várias formas geométricas Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 146 Graphics View ● Arquitetura: – Cena: ● Provê interface rápida para manipulação uma quantidade grande de itens ● Propaga eventos para cada item ● Gerencia o estado do item, como seleção e foco ● Provê funcionalidades de rendering sem transformações – View: ● Visualiza o conteúdo da cena ● Recebe eventos de teclado e mouse e os traduz para eventos de cena ● Pode transformar o sistema de coordenadas de cena ● Se não transformada visualiza uma unidade da cena como um pixel na view Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 147 Graphics View ● Arquitetura: – Item: ● QGraphicsItem é a classe base de todos os itens ● O Qt disponibiliza itens padrão para as primitivas básicas ● Você pode desenvolver o seu próprio item ● Suporte aos eventos de teclado e mouse ● Drag and drop ● Relacionamento através de parentesco e agrupamento ● Detecção de colisão através da função shape() e collidsWith() ● É definido no seu sistema de coordenadas local ● Podem sofrer transformações locais, repassando-as para os filhos Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 148 Graphics View ● Arquitetura: – Itens pré-definidos no Qt Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 149 Graphics View ● Sistemas de Coordenadas: – Coordenadas de item, de cena e de view – Funções de conveniência permitem fazer a conversão: ● Que item foi clicado ? – QGraphicsView::mapToScene() + QGraphicsScene::itemAt() ● Onde no view o item está localizado ? – QGraphicsItem::mapToScene() + QGraphicsView::mapFromScene() ● Quais itens estão 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 150 Graphics View 1 class View : public QGraphicsView 2 { 3 Q_OBJECT 4 ... 5 public slots: 6 void zoomIn() { scale(1.2, 1.2); } 7 void zoomOut() { scale(1 / 1.2, 1 / 1.2); } 8 void rotateLeft() { rotate(-10); } 9 void rotateRight() { rotate(10); } 10 ... 11 }; ● Implementando zoom e rotação Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 151 Lab15: Coordenadas 1 QGraphicsScene scene; 2 QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100)); 3 4 QGraphicsItem *item = scene.itemAt(50, 50); 5 // item == rect 6 7 QGraphicsScene scene; 8 myPopulateScene(&scene); 9 10 QGraphicsView view(&scene); 11 view.show(); ● Implementar seleção de itens e operações Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 152 Lab16: 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 }; ● Implementando novos itens Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 153 XML ● O Módulo QtXml disponibiliza duas interfaces para manipulaçãode XML: ● SAX (Simple API for XML): reporta eventos de parsing diretamente para a aplicação, pouco consumo de memória, não suporta navegação na estrutura ● DOM (Document Object Model): converte um documento XML em uma árvore de objetos, na qual a aplicação pode navegar. Mantém a estrutura em memória Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 154 XML ● Lendo XML com o SAX ● O Qt disponibiliza a classe QXmlSimpleReader para a leitura não validada de documentos XML ● Funções virtuais de objetos handler registrados são invocadas para sinalizar os eventos Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 155 XML 1 <doc> 2 <quote>Ars longa vita brevis</quote> 3 </doc> 1 startDocument() 2 startElement("doc") 3 startElement("quote") 4 characters("Ars longa vita brevis") 5 endElement("quote") 6 endElement("doc") 7 endDocument() Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 156 Lab17: XML SAX 1 class SaxHandler : public QXmlDefaultHandler 2 { 3 public: 4 SaxHandler(QTreeWidget *tree); 5 bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &attributes); 6 bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName); 7 bool characters(const QString &str); 8 bool fatalError(const QXmlParseException &exception); 9 10 private: 11 QTreeWidget *treeWidget; 12 }; ● Exemplo de classe handler para o SAX Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 157 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 } ● Processando o XML Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 158 XML ● Lendo XML com o DOM ● Provê uma interface para acessar e modificar o conteúdo e estrutura de um arquivo XML ● Todos os nós da árvore do documento são derivados de QDomNode Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 159 Lab18: XML DOM 1 QDomDocument doc("mydocument"); 2 QFile file("mydocument.xml"); 3 if (!file.open(QIODevice::ReadOnly)) 4 return; 5 if (!doc.setContent(&file)) { 6 file.close(); 7 return; 8 } 9 file.close(); ● Lendo XML com o DOM Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 160 Lab18: XML DOM 10 QDomElement docElem = doc.documentElement(); 11 12 QDomNode n = docElem.firstChild(); 13 while(!n.isNull()) { 14 QDomElement e = n.toElement(); 15 if(!e.isNull()) { 16 cout << qPrintable(e.tagName()) << endl; 17 } 18 n = n.nextSibling(); 19 } 20 21 QDomElement elem = doc.createElement("img"); 22 elem.setAttribute("src", "myimage.png"); 23 docElem.appendChild(elem); ● Lendo XML com o DOM Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 161 XML ● A partir da versão 4.3 do Qt, as classes QXmlStreamReader e QXmlStreamWriter simplificam este processo ● O módulo 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 162 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 páginas de servidores web ● O Qt também provê classes de nível mais baixo como QTcpSocket e QUdpSocket ● Para tratar conexões 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 163 Lab19: Networking 1 QNetworkAccessManager *manager = new QNetworkAccessManager(this); 2 connect(manager, SIGNAL(finished(QNetworkReply*)), 3 this, SLOT(replyFinished(QNetworkReply*))); 4 5 manager->get(QNetworkRequest(QUrl("http://qt.nokia.com"))); ● Usando o QNetworkAccessManager Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 164 Internacionalização ● O Qt suporta unicode, idiomas não derivados do Latin e escritos da direita para a esquerda ● O Qt torna fácil traduzir todo um sistema de um idioma para outro: – Envolva toda string visível pelo usuário 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 165 Internacionalização ● Grande parte das aplicações carrega o arquivo de traduções no momento em que é iniciada, baseado nas configurações de locale do sistema ● O Qt também possibilita a troca, em tempo de execução, do idioma utilizado pelo sistema ● O Qt também permite a seleção de imagens (ícones, splashs etc) a depender do locale do sistema Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 166 Lab20: Internacionalização 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 } ● Carregando a tradução ao iniciar a aplicação Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 167 Multithreading ● O desenvolvimento de aplicações multithreading é importante para um melhor aproveitamento dos recursos da máquina 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 168 Multithreading 1 class MyThread : public QThread 2 { 3 Q_OBJECT 4 protected: 5 void run(); 6 }; 7 8 void MyThread::run() 9 { 10 ... 11 } 12 13 … 14 MyThread t; 15 t.start(); // dettach ● Definindo e criando uma nova thread Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 169 Multithreading ● Desenvolvimento multithreading frequentemente leva a condições de corrida ● Class Qt para sincronização de threads: ● QMutex: lock mutualmente exclusivo ● QReadWriteLock: lock que distingue entre acesso para leitura e escrita ● QSemaphore: generalização do QMutex para proteger mais de um recurso ● QWaitCondition: acorda outras threads quando uma condição é atendida Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 170 Multithreading ● Reentrância e Thread-Safety: ● Uma função thread-safe pode ser chamada simultaneamente de múltiplas threads, mesmo quando as invocações usam dados compartilhados, pois todas as referências aos dados compartilhados são serializadas ● Uma função reentrante pode também ser chamada simultaneamente de múltiplas threads, mas somente se cada invocação usa seus próprios dados Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 171 Multithreading 1 class Counter 2 { 3 public: 4 Counter() { n = 0; } 5 6 void increment() { ++n; } 7 void decrement() { --n; } 8 int value() const { return n; } 9 10 private: 11 int n; 12 }; ● Classe reentrante porém não thread-safe Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 172 Lab21: Sincronizando 1 class Counter 2 { 3 public: 4 Counter() { n = 0; } 5 6 void increment() { QMutexLocker locker(&mutex); ++n; } 7 void decrement() { QMutexLocker locker(&mutex); --n; } 8 int value() const { QMutexLocker locker(&mutex); return n;} 9 10 private: 11 mutable QMutex mutex; 12 int n; 13 }; ● Tornando a classe thread-safe Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 173 Lab22: QtConcurrent 1 // Instantiate the objects and connect to the finished signal. 2 MyClass myObject; 3 QFutureWatcher<int> watcher; 4 connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished())); 5 6 // Start the computation. 7 QFuture<int> future = QtConcurrent::run(...); 8 watcher.setFuture(future); ● Usando QtConcurrent Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 174 Plugins ● O que é um plugin ? ● “É uma biblioteca dinâmica que implementa uma interface particular, com o objetivo de prover funcionalidades extras.”; (C++ GUI Programming with Qt4) ● Não requer que seja previamente compilada e linkada à aplicação ● O Qt4 possui um conjunto próprio de interfaces de plugins para domínios tais como: ● Formato de imagens, drivers de banco de dados, estilos de widgets, codificação de texto etc. Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 175 Plugins ● É possível criar novos domínios de plugins, específicos para uma aplicação em particular ● O framework para plugins do Qt adiciona recursos de conveniência e segurança à classe QLibrary ● Para criar um plugin para os domínios 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 176 Plugins ● É possível criar novos domínios de plugins, específicos para uma aplicação em particular ● O framework para plugins do Qt adiciona recursos de conveniência e segurança à classe QLibrary ● Para criar um plugin para os domínios já existentes do Qt precisa-se implementar duas classes: ● Plugin Wrapper ● Plugin Handler Classe factory para criação de novos handlers Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 177 Plugins ● É possível criar novos domínios de plugins, específicos para uma aplicação em particular ● O framework para plugins do Qt adiciona recursos de conveniência e segurança à classe QLibrary ● Para criar um plugin para os domínios já existentes do Qt precisa-se implementar duas classes: ● Plugin Wrapper ● Plugin Handler Classe que efetivamente implementa a funcionalidade Classe factory para criação de novos handlers Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 178 Plugins ● Estas duas classes deverão ser filhas de classes disponibilizadas pelo Qt Wrapper Handler QAccessibleBridgePlugin QAccessibleBridge QAccessiblePlugin QAccessibleInterface QIconEnginePlugin QIconEngine QImageIOPlugin QImageIOHandler QInputContextPlugin QInputContext QPictureFormatPlugin - QSqlDriverPlugin QSqlDriver QStylePlugin QStyle QTextCodecPlugin QTextCodec Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 179 Plugins ● Os plugins para os domínios do Qt são invocados pelos próprios objetos do Qt (ex: QImageReader, QImageWriter) ● Plugins instalados globalmente devem estar localizados no diretório $QTDIR/plugins/ ● Plugins instalados localmente devem estar no subdiretório plugins/ do diretório que contém o executável da aplicação Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 180 Plugins ● A arquitetura de plugins do Qt é uma abordagem interessante para a extensão facilitada de aplicações em C++ ● As classes QLibrary e QPluginLoader do Qt realizam o processo de carga dinâmica de novas classes ● Se as interfaces dos plugins forem bem projetadas, pode-se estender aplicações sem requerer novas recompilações ● Alternativas: QtScript, Kross ... Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 181 Lab23: Plugins ● Definição de uma interface da aplicação ● Implementação de dois plugins ● Carga dos plugins no início da aplicação Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 182 Lab24: Qt Mobile ● O NOKIA Qt SDK torna o processo substancialmente mais fácil ● API's específicas para mobile Desenvolvimento Cross-Platform com C++ e Qt - Sandro Santos Andrade - Live Blue 183 Conclusão ● Crescente expansão do Qt na indústria ● 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 184 FIM Desenvolvimento Cross-Platform com C++ e Qt Sandro Santos Andrade sandroandrade@kde.org Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58 Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 66 Slide 67 Slide 68 Slide 69 Slide 70 Slide 71 Slide 72 Slide 73 Slide 74 Slide 75 Slide 76 Slide 77 Slide 78 Slide 79 Slide 80 Slide 81 Slide 82 Slide 83 Slide 84 Slide 85 Slide 86 Slide 87 Slide 88 Slide 89 Slide 90 Slide 91 Slide 92 Slide 93 Slide 94 Slide 95 Slide 96 Slide 97 Slide 98 Slide 99 Slide 100 Slide 101 Slide 102 Slide 103 Slide 104 Slide 105 Slide 106 Slide 107 Slide 108 Slide 109 Slide 110 Slide 111 Slide 112 Slide 113 Slide 114 Slide 115 Slide 116 Slide 117 Slide 118 Slide 119 Slide 120 Slide 121 Slide 122 Slide 123 Slide 124 Slide 125 Slide 126 Slide 127 Slide 128 Slide 129 Slide 130 Slide 131 Slide 132 Slide 133 Slide 134 Slide 135 Slide 136 Slide 137 Slide 138 Slide 139 Slide 140 Slide 141 Slide 142 Slide 143 Slide 144 Slide 145 Slide 146 Slide 147 Slide 148 Slide 149 Slide 150 Slide 151 Slide 152 Slide 153 Slide 154 Slide 155 Slide 156 Slide 157 Slide 158 Slide 159 Slide 160 Slide 161 Slide 162 Slide 163 Slide 164 Slide 165 Slide 166 Slide 167 Slide 168 Slide 169 Slide 170 Slide 171 Slide 172 Slide 173 Slide 174 Slide 175 Slide 176 Slide 177 Slide 178 Slide 179 Slide 180 Slide 181 Slide 182 Slide 183 Slide 184
Compartilhar