Linguagem de Programação I Carlos Eduardo Batista Centro de Informática - UFPB bidu@ci.ufpb.br
Introdução ao Qt O ambiente Qt Creator QML API C++ Interfaces gráficas usando Qt 2
É um framework para aplicações multiplataforma em C++ É baseado no C++ padrão mas pode ser utilizado com diversas outras linguagens. Suporta aplicações com e sem interface gráfica. Desenvolvido inicialmente pela TrollTech, foi mantido como projeto OpenSource pela Nokia e atualmente pertence a Digia É suportado pelas principais plataformas móveis e de desktop Permite escrever um único código para múltiplas plataformas. Qt 5 Qt 3
Possui suporte a internacionalização de Aplicações. É distribuido nas licenças LGPL v2.1, GPL e Comercial (Qt Comercial) Suporta recursos gráficos avançados Permite a mistura de código nativo com código web Possui uma IDE com suporte a recursos avançados. Qt Creator 3.1 Qt 4
5
Utiliza o conceito de sinal-slot, modelo MVC, graphics view/scene/item. Possui ampla documentação. Uma comunidade ativa e participativa Vários projetos usam Skype, Maya, Google Earth, KDE, Spotify (Linux), Virtualbox, VLC... Versão corrente: Qt 5 Qt 6
Qt 7
Qt 8
Qt 9
QtQuick (Qt User Interface Creation Kit) é uma interface de alto nível para criação simplificada de interfaces. É composto por: QML: Uma linguagem declarativa Qt Creator API em C++ para integração com o Qt Qt Interface 10
QML é uma linguagem declarativa para elementos de interface gráfica. Descreve a interface gráfica Como os elementos são Como eles se comportam A interface final é uma árvore de elementos com propriedades (semelhante ao HTML) Qt - QML 11
Qt - QML 12
Para usar um módulo, primeiro precisamos importá-lo. Especifica o nome do módulo e a versão desejada import QtQuick 1.1 // Define um quadrado azul claro Rectangle { width: 400; height: 400 color: "lightblue" } Qt - QML 13
Vários elementos estão disponível para uso. São estruturas na linguagem Representam partes visíveis e não visíveis. Item é o elemento mais básico Não é visível por si só Tem uma posição e dimensões É usado para agrupar elementos visuais Geralmente é o elemento de maior nível Outros elementos: Text, TextInput, Page, Circle, Row, Column... Qt - QML 14
QML também define elementos sem representação visual Estados, transições. Gradientes, timers. Cada elemento possui propriedades Propriedades customizadas podem podem ser criadas Consultar documentação sobre as propriedades de cada tipo de elemento. Qt - QML 15
O Qt Creator IDE possui: Editor visual para criar e editar componentes QML Construtor de GUI (Interface Gráfica com o Usuário) Ferramentas de projeto e build de aplicações Sistema de ajuda integrado e sensível ao contexto Debugger visual Ferramentas para navegação rápida no código Qt Creator 16
Editor de código com suporte a C++, QML e ECMAscript Ferramentas de navegação rápida pelo código Realçamento de sintaxe e auto-complemento de código Checagem estática de código e dicas de estilo enquanto você digita Suporte a refatoração de código Ajuda sensível a contexto Dobramento de código Correspondência de parênteses e modo de seleção de parênteses Qt Creator 17
O depurador visual para C++ conhece a estrutura de muitas classes Qt, aumentando sua habilidade de exibir os dados do Qt claramente. Addicionalmente, o Qt Creator exibe os dados brutos do GDB de modo limpo e conciso. Interrompa a execução do programa. Ande através do programa linha por linha ou instrução por instrução. Defina pontos de parada. Examine o conteúdo da pilha de chamada, observadores e variáveis locais e globais. Qt Creator 18
Qt Creator 19
Qt Creator 20
Qt Creator 21
O Qt Quick suporta interação com C++ QtDeclarative é a API que permite interagir e gerenciar componentes A interação ocorre através de objetos expostos ao ambiente QML como novos tipos Elementos não visuais são subclasses do tipo QObject. Tipos visuais (items) são subclasses do tipo QDeclarativeItem QdeclarativeItem é o equivalente ao Item do QML A interação entre QML e C++ ocorre através de: Propriedades Sinais e Slots (métodos que não retornam valores) Métodos (definidos com a macro Q_INVOKABLE) Qt API C++ 22
Aplicação Exemplo 23
class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); protected: void closeevent(qcloseevent *event); private: QPlainTextEdit *textedit; QString curfile; QMenu *filemenu; QMenu *editmenu; QMenu *helpmenu; QToolBar *filetoolbar; QToolBar *edittoolbar; QAction *newact; QAction *openact; QAction *saveact; QAction *saveasact; QAction *exitact; QAction *cutact; QAction *copyact; QAction *pasteact; QAction *aboutact; QAction *aboutqtact; }; 24
private slots: void newfile(); void open(); bool save(); bool saveas(); void about(); void documentwasmodified(); void createactions(); void createmenus(); void createtoolbars(); void createstatusbar(); void readsettings(); void writesettings(); bool maybesave(); void loadfile(const QString &filename); bool savefile(const QString &filename); void setcurrentfile(const QString &filename); QString strippedname(const QString &fullfilename); 25
MainWindow::MainWindow() { textedit = new QPlainTextEdit; setcentralwidget(textedit); createactions(); createmenus(); createtoolbars(); createstatusbar(); readsettings(); connect(textedit->document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified())); setcurrentfile(""); setunifiedtitleandtoolbaronmac(true); } 26
void MainWindow::about() { QMessageBox::about(this, tr("about Application"), tr("the <b>application</b> example demonstrates how to " "write modern GUI applications using Qt, with a menu bar, " "toolbars, and a status bar.")); } 27
bool MainWindow::maybeSave() { if (textedit->document()->ismodified()) { QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("application"), tr("the document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Save QMessageBox::Discard QMessageBox::Cancel); if (ret == QMessageBox::Save) return save(); else if (ret == QMessageBox::Cancel) return false; } return true; } 28
void MainWindow::loadFile(const QString &filename) { QFile file(filename); if (file.open(qfile::readonly QFile::Text)) { QMessageBox::warning(this, tr("application"), tr("cannot read file %1:\n%2.").arg(fileName).arg(file.errorString())); return; } QTextStream in(&file); #ifndef QT_NO_CURSOR QApplication::setOverrideCursor(Qt::WaitCursor); #endif textedit->setplaintext(in.readall()); #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); #endif setcurrentfile(filename); statusbar()->showmessage(tr("file loaded"), 2000); } 29
bool MainWindow::saveFile(const QString &filename) { QFile file(filename); if (file.open(qfile::writeonly QFile::Text)) { QMessageBox::warning(this, tr("application"), tr("cannot write file %1:\n%2.").arg(fileName).arg(file.errorString())); return false; } QTextStream out(&file); #ifndef QT_NO_CURSOR QApplication::setOverrideCursor(Qt::WaitCursor); #endif out << textedit->toplaintext(); #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); #endif setcurrentfile(filename); statusbar()->showmessage(tr("file saved"), 2000); return true; } 30
#include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { Q_INIT_RESOURCE(application); QApplication app(argc, argv); app.setorganizationname("qtproject"); app.setapplicationname("application Example"); MainWindow mainwin; mainwin.show(); return app.exec(); } 31
http://qt-project.org/doc/qt-5/qtwidgetsmainwindows-application-example.html Aplicação exemplo 32
http://qt-project.org/doc/qt-5/qtquickwindow-example.html http://qt-project.org/doc/qt-5/qtwidgetsmainwindows-mainwindow-example.html Outros exemplos 33
Notas de aula Claudio Esperança e Paulo Cavalcanti (UFRJ) Notas de aula Allan Lima (citi/ufpe) Notas de aula Daniel Bittencourt (INdT) Referências 34
Linguagem de Programação I Carlos Eduardo Batista Centro de Informática - UFPB bidu@ci.ufpb.br