Publicado em Programação, Qt

Como compilar um programa escrito em C++/QT

Depois de ter decidido aprender a utilizar o [cute four] escrevi o típico “Hello World!”.

Como este é extremamente simples, vou utilizar um exemplo um nadinha mais complexo às custas do qual, aqui entre nós, cheguei a “fazer cenas tristes” por não estar a perceber o motivo pelo qual o botão “reset” não funcionava :)

Esta é uma aplicação muito simples que permite definir três valores compreendidos entre 0 e 255.

O seu funcionamento é intuitivo e é composto por três ficheiro:

  • main.cpp
  • mainwindow.cpp
  • mainwindow

main.cpp

#include <QApplication>
#include "mainwindow.h"
int main ( int argc, char *argv [] ){
	QApplication app ( argc, argv );
	MainWindow *janela = new MainWindow;
	janela->setWindowTitle ("Modelo RGB!");
	janela->show();
	return app.exec();
}

mainwindow.cpp

#include <QtGui>
#include "mainwindow.h"
MainWindow::MainWindow (QWidget *parent):QWidget(parent){
	//objects
	botaoReset	= new QPushButton("Reset");
	botaoSair	= new QPushButton("Sair");
	textoRed	= new QLabel("Red");
	textoGreen	= new QLabel("Green");
	textoBlue	= new QLabel("Blue");
	spinBoxRed	= new QSpinBox;
	spinBoxGreen= new QSpinBox;
	spinBoxBlue	= new QSpinBox;
	//properties
	spinBoxRed->setRange(0, 255);
	spinBoxGreen->setRange (0, 255);
	spinBoxBlue->setRange (0, 255);
	sliderRed = new QSlider(Qt::Horizontal);
	sliderGreen = new QSlider(Qt::Horizontal);
	sliderBlue = new QSlider(Qt::Horizontal);
	sliderRed->setRange(0, 255);
	sliderGreen->setRange(0, 255);
	sliderBlue->setRange(0, 255);
	// Signals and slots :
	connect ( spinBoxRed, SIGNAL(valueChanged( int)), sliderRed, SLOT(setValue (int)));
	connect ( sliderRed, SIGNAL(valueChanged( int)), spinBoxRed, SLOT(setValue (int)));
	connect ( spinBoxGreen, SIGNAL(valueChanged(int )), sliderGreen, SLOT(setValue (int)));
	connect ( sliderGreen, SIGNAL(valueChanged(int)), spinBoxGreen, SLOT(setValue (int)));
	connect ( spinBoxBlue, SIGNAL(valueChanged(int)), sliderBlue, SLOT(setValue (int)));
	connect ( sliderBlue, SIGNAL(valueChanged( int)), spinBoxBlue, SLOT(setValue (int )));
	connect ( botaoSair, SIGNAL(clicked()), this, SLOT(close ()));
	connect ( botaoReset, SIGNAL(clicked()), this, SLOT(resetSliders()));
	// Layouts :
	QGridLayout *layoutCores = new QGridLayout;
	layoutCores->addWidget(textoRed, 0, 0, 1, 1);
	layoutCores->addWidget(spinBoxRed, 0, 1, 1,1);
	layoutCores->addWidget(sliderRed,0, 2, 1, 1);
	layoutCores->addWidget(textoGreen, 1, 0, 1, 1);
	layoutCores->addWidget(spinBoxGreen, 1, 1, 1, 1);
	layoutCores->addWidget(sliderGreen, 1, 2, 1, 1);
	layoutCores->addWidget(textoBlue,2, 0, 1, 1 );
	layoutCores->addWidget(spinBoxBlue, 2, 1, 1, 1);
	layoutCores->addWidget(sliderBlue, 2, 2, 1, 1);

	QHBoxLayout *layoutControlo = new QHBoxLayout;
	layoutControlo->addWidget(botaoReset);
	layoutControlo->addWidget(botaoSair);

	QVBoxLayout *layoutJanela = new QVBoxLayout;
	layoutJanela->addLayout(layoutCores);
	layoutJanela->addLayout(layoutControlo);
	setLayout(layoutJanela);
}

void MainWindow::resetSliders (){
	sliderRed-> setValue (0);
	sliderGreen->setValue (0);
	sliderBlue->setValue (0);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QDialog>
class QPushButton;
class QLabel;
class QSpinBox;
class QSlider;
class QGridLayout;
class QVBoxLayout;
class QHBoxLayout;
class MainWindow : public QWidget{
	Q_OBJECT
	public :
	MainWindow ( QWidget* parent = 0 );
	private slots :
	void resetSliders ( );
	private :
	QPushButton *botaoReset;
	QPushButton *botaoSair;
	QLabel *textoRed;
	QLabel *textoGreen;
	QLabel *textoBlue;
	QSpinBox *spinBoxRed;
	QSpinBox *spinBoxGreen;
	QSpinBox *spinBoxBlue;
	QSlider *sliderRed;
	QSlider *sliderGreen;
	QSlider *sliderBlue;
};
#endif

Vamos então tratar de compilar este exemplo para vermos isto a funcionar.
Vou optar por uma exposição passo a passo.

#1 Que ficheiros temos
Nesta fase convém ter um directoria “rgb” contendo os três ficheiros main.cpp, mainwindow.cpp e mainwindow.h.

  • main.cpp
  • mainwindow.cpp
  • mainwindow.h

#2 Criar o projecto

$ qmake -project
  • main.cpp
  • mainwindow.cpp
  • mainwindow.h
  • rgb.pro

#3 Gerar a Makefile

$ qmake rgb.pro
  • main.cpp
  • mainwindow.cpp
  • mainwindow.h
  • Makefile
  • rgb.pro


#4 E finalmente compilar todos os ficheiros que fazem parte do projecto

$ make
  • main.cpp
  • mainwindow.cpp
  • mainwindow.o
  • moc_mainwindow.cpp
  • rgb
  • main.o
  • mainwindow.h
  • Makefile
  • moc_mainwindow.o
  • rgb.pro

Agora basta executar o binário obtido (rgb) para ver este exemplo em acção.
Facilmente se pode concluir que à medida que os projectos adquiram uma dimensão maior, será necessário algum trabalho de arrumação, de forma a evitar esta mistura de ficheiros de diferentes tipos.
Outro aspecto que considero importante aqui referir é que este processo pode ser executado independentemente da plataforma que estivermos a utilizar. Eu utilizo Debian GNU/Linux, mas os utilizadores de Windows (e outros) podem igualmente testar este exemplo.

Neste momento estou a utilizar montes de “hand coding” mas não se assustem! Mais para a frente vamos pedir ajuda ao QT Designer.

Anúncios

2 opiniões sobre “Como compilar um programa escrito em C++/QT

  1. gostaria de saber passo a passo como faco para criar um desenhar programa(software), compilar, fazer correr e talvez por uma musica, pra quando eu abrir tocar. peco que mande os algoritmos ou desenho feito para que eu possa a digitar e finalmente ter o resultado, mas tudo isso em c++ ou em java.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s