Conteúdo 1 Básico, Ferramentas e o Primeiro Programa em Qt 3 1.1 Primeiro Programa.......................... 3 1.1.1 Compilando o programa................... 4 1.2 Layouts................................ 5 1.3 Signals e Slots............................. 6 1.3.1 Sinais emitindo valores.................... 6 2 Recursos básicos de C++ 9 2.1 Tipos de dados............................ 9 2.1.1 Tamanhos........................... 10 2.2 Declarações.............................. 10 2.2.1 A estrutura de uma declaração............... 10 2.2.2 Declarando nomes múltiplos................. 10 2.2.3 Escopo............................. 10 2.2.4 Typedef............................ 10 1
2 CONTEÚDO
Capítulo 1 Básico, Ferramentas e o Primeiro Programa em Qt 1.1 Primeiro Programa Seguindo o exemplo de muitos livros e tutoriais de programação, vamos criar o tradicional programa Hello, World!. Esta é uma aplicação mínima usando Qt e simplesmente abre uma janela exibindo a frase Hello, World!. 1 #include <QApplication> 2 #include <QLabel> 3 4 int main ( int argc, char argv ) 5 { 6 QApplication app ( argc, argv ) ; 7 8 QLabel l a b e l ( " Hello, World! " ) ; 9 l a b e l. show ( ) ; 10 11 return app. exec ( ) ; 12 } Listing 1.1: helloworld/main.cpp A Listagem 1.1 apresenta o código-fonte do exemplo citado, podendo-se destacar alguns pontos. As linhas 1 e 2 incluem os arquivos de cabeçalho (headers) que contém as classes que serão usadas no decorrer do código. Neste caso, estes arquivos contém a descrição das classes QApplication e QLabel. No Qt 4 cada classe está contida em um arquivo de cabeçalho, sendo o mesmo nomeado sem a extensão.h (comum em C e C++). Os arquivos que contém a classe possuem o mesmo nome da classe em questão. A linha 4 apresenta a função main(). Nela estão contidas as rotinas que serão executadas no início da execução do programa. Neste caso, primeiramente (linha 6) é criado um objeto do tipo QApplication que é responsável pelo controle de 3
4CAPÍTULO 1. BÁSICO, FERRAMENTAS E O PRIMEIRO PROGRAMA EM QT aplicativos grácos (GUI). Este objeto, entre outras coisas, é responsável pelo loop do programa. Nas linhas 8 e 9 pode-se observar, respectivamente, a criação de um label com o texto Hello, World! e a exibição do mesmo. A Figura 1.1 ilustra o resultado do programa. Figura 1.1: Primeiro programa em Qt. Finalmente, na linha 11, a chamada ao método exec() faz com que o programa entre em um laço, recebendo e gerando eventos para os objetos apropriados. Este laço é terminado quando o método quit() do objeto QApplication é chamado. Neste exemplo, isto acontece indiretamente quando a última janela do aplicativo (neste caso a janela que contém o label) é fechada. Assim que fechada, a mesma é deletada da memória. 1.1.1 Compilando o programa Qt é suportado por muitas plataformas e torna-se evidente o problema de portabilidade de aplicativos entre sistemas operacionais. Para resolver este problema foi criada uma ferramenta: o qmake. O qmake gera um Makele a partir de um arquivo que descreve as propriedades do projeto. Sendo este arquivo independente de plataforma, o mesmo projeto pode ser compilado para outro sistema operacional sem nenhum ônus. Este arquivo contém toda informação necessária para compilar o programa em qualquer plataforma suportada. Para gerar o arquivo de projeto do programa Hello, World!, é necessário executar o programa qmake com a opção -project na pasta em que se encontra o projeto. Será gerado um arquivo como o apresentado na Listagem 1.2. Listing 1.2: helloworld/helloworld.pro 1 ###################################################################### 2 # Automatically generated by qmake ( 2. 0 1 a ) t e r ago 10 0 9 : 5 8 : 2 6 2010 3 ###################################################################### 4 5 TEMPLATE = app 6 TARGET = 7 DEPENDPATH +=. 8 INCLUDEPATH +=. 9 10 # Input 11 SOURCES += main. cpp Após a criação do arquivo de projeto, executando novamente o programa qmake, o Makele será gerado. Para compilar o programa basta executar o comando make na linha de comando. Será gerado um arquivo executável com o nome de helloworld.
1.2. LAYOUTS 5 1.2 Layouts Layouts permitem que componentes sejam arranjados ordenadamente na aplicação. Para isso, podemos usar o sistema de layouts do Qt, que arranja os componentes de forma automática assim como forem inseridos nas janelas. A Figura 1.2 ilustra dois labels dispostos dentro de um contêiner vertical. Em complemento ao exemplo anterior (Listagem 1.1), foi adicionado o objeto QVBoxLayout, responsável pela organização dos componentes de forma vertical o V indica vertical. Também foi criado um widget que representará a janela em que serão inseridos o widget e os labels. A Listagem 1.3 ilustra a criação de uma janela com dois labels dispostos de forma vertical. Na linha 11 é criado um objeto do tipo QVBoxLayout que representa um layout do tipo vertical. O construtor do objeto recebe por parâmetro a qual widget o mesmo irá estar associado (neste caso o objeto criado na linha 9). Nas linhas 12 e 13 são criados dois objetos do tipo QLabel que, posteriormente, nas linhas 15 e 16 são inseridos no layout principal. A linha 18 exibe o resultado. Listing 1.3: layout/main.cpp 1 #include <QApplication> 2 #include <QVBoxLayout> 3 #include <QLabel> 4 5 int main ( int argc, char argv ) 6 { 7 QApplication app ( argc, argv ) ; 8 9 QWidget window ; 10 11 QVBoxLayout mainlayout = new QVBoxLayout(&window ) ; 12 QLabel l a b e l 1 = new QLabel ( " Label 1" ) ; 13 QLabel l a b e l 2 = new QLabel ( " Label 2" ) ; 14 15 mainlayout >addwidget ( l a b e l 1 ) ; 16 mainlayout >addwidget ( l a b e l 2 ) ; 17 18 window. show ( ) ; 19 20 return app. exec ( ) ; 21 } Figura 1.2: Um widget com layout vertical.
6CAPÍTULO 1. BÁSICO, FERRAMENTAS E O PRIMEIRO PROGRAMA EM QT 1.3 Signals e Slots Signals e slots permitem que objetos se comuniquem de uma forma fácil e amigável, tornando a programação de interfaces simples e direta. Para ilustrar o seu uso, a Listagem 1.4 apresenta a criação de uma janela contendo um botão que ao ser pressionado fecha a aplicação. Na Figura 1.3 é ilustrada a tela da aplicação. Listing 1.4: signalslot/main.cpp 1 #include <QApplication> 2 #include <QPushButton> 3 4 int main ( int argc, char argv ) 5 { 6 QApplication app ( argc, argv ) ; 7 8 QPushButton button ( " S a i r " ) ; 9 button. show ( ) ; 10 11 QObject : : connect (&button, SIGNAL( c l i c k e d ( ) ), &app, SLOT( q u i t ( ) ) ) ; 12 13 return app. exec ( ) ; 14 } Pode-se destacar a criação de um objeto do tipo QPushButton, na linha 8, para representar um botão. A linha 9 ativa sua visualização. Também é importante salientar, na linha 11, a chamada ao método estático connect do objeto QObject. Este é responsável pela conexão de um sinal de um objeto (neste caso a função click() do objeto botão, que representa o pressionamento do mesmo) a alguma função de destino (neste caso a função quit(), responsável pelo fechamento da aplicação). Figura 1.3: Exemplo usando signals e slots. 1.3.1 Sinais emitindo valores Na Listagem 1.5 pode-se observar um exemplo um pouco mais elaborado no uso de signals e slots. Neste exemplo, quando o usuário interage com os objetos QSpinBox ou QSlider, são gerados sinais que levam a informação sobre qual o valor atual contido nos mesmos. Nas linhas 22 a 25 verica-se a conexão dos sinais dos objetos passíveis a mudanças (QSpinBox e QSlider) aos receptores dos objetos interessados em receber tal informação (QLabel, QSpinBox e QSlider). A Figura 1.3.1 apresenta o resultado nal da aplicação.
1.3. SIGNALS E SLOTS 7 Listing 1.5: signalslot2/main.cpp 1 #include <QApplication> 2 #include <QVBoxLayout> 3 #include <QLabel> 4 #include <QSpinBox> 5 #include <QSlider> 6 7 int main ( int argc, char argv ) 8 { 9 QApplication app ( argc, argv ) ; 10 11 QWidget window ; 12 13 QVBoxLayout mainlayout = new QVBoxLayout(&window ) ; 14 QLabel l a b e l = new QLabel ( "0" ) ; 15 QSpinBox spinbox = new QSpinBox ; 16 QSlider s l i d e r = new QSlider (Qt : : H o r i z o n t a l ) ; 17 18 mainlayout >addwidget ( l a b e l ) ; 19 mainlayout >addwidget ( spinbox ) ; 20 mainlayout >addwidget ( s l i d e r ) ; 21 22 QObject : : connect ( spinbox, SIGNAL( valuechanged ( int ) ), l a b e l, SLOT( setnum ( int ) ) ) ; 23 QObject : : connect ( spinbox, SIGNAL( valuechanged ( int ) ), s l i d e r, SLOT( setvalue ( int ) ) ) ; 24 QObject : : connect ( s l i d e r, SIGNAL( valuechanged ( int ) ), l a b e l, SLOT( setnum ( int ) ) ) ; 25 QObject : : connect ( s l i d e r, SIGNAL( valuechanged ( int ) ), spinbox, SLOT( setvalue ( int ) ) ) ; 26 27 window. show ( ) ; 28 29 return app. exec ( ) ; 30 } Figura 1.4: Exemplo melhorado usando signals e slots. Os três elementos exibem o mesmo valor.
8CAPÍTULO 1. BÁSICO, FERRAMENTAS E O PRIMEIRO PROGRAMA EM QT
Capítulo 2 Recursos básicos de C++ Esta parte descreve os tipos primitivos e os recursos básicos de C++ para a construção de programas com tais tipo. O subconjunto C de C++ é apresentado junto com o suporte adicional oferecido por C++ para os estilos de programação tradicionais. Ela também discute os recursos básicos para compor um programa C++ a partir de partes lógicas físicas. 2.1 Tipos de dados C++ tem um conjunto de tipos básicos que correspondem às unidades de armazenamento básicas mais comuns de um computador e às maneiras mais comuns de utilizá-las para armazenar dados: 1. Tipo lógico (bool) 2. Tipos de caracteres (char) 3. Tipos inteiros (int) 4. Tipos de ponto utuante (double) Além disso, o usuário pode denir tipos de enumeração para representar conjuntos de valores especícos (enum). Também existe em C++ (como em C) um tipo void, usado para indicar ausência de informação. A partir desses tipos básicos, podemos construir outros tipos, como: 1. Tipos ponteiros (int*) 2. Tipos de arrays (char[]) 3. Tipos de referência (como double&) 4. Estruturas de dados e classes 9
10 CAPÍTULO 2. RECURSOS BÁSICOS DE C++ 2.1.1 Tamanhos 2.2 Declarações 2.2.1 A estrutura de uma declaração 2.2.2 Declarando nomes múltiplos 2.2.3 Escopo 2.2.4 Typedef
Índice bool, 9 char, 9 char[], 9 double, 9 double&, 9 int, 9 int*, 9 QApplication, 3, 4 QLabel, 3, 6 qmake, 4 QObject, 6 QPushButton, 6 QSlider, 6 QSpinBox, 6 QVBoxLayout, 5 Signals e slots, 6 void, 9 widget, 5 11