C++ em QT 4

QT 4 é a ferramenta que nos permite trabalhar na parte gráfica da programação, logo involve código mais complicado, mas que não é impossível de compreender.

Por agora, o objectivo é ter algo como isto no fim da nossa jornada pela programação em QT 4:

qt

Vamos começar a pouco-a-pouco construir esta janela. O primeiro passo é escrever os dias da semana como no lado esquerdo da nossa aplicação:

#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTimeEdit>
#include <QHBoxLayout>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QWidget *janela = new QWidget;

	QLabel *segunda = new QLabel("segunda");
	QLabel *terca = new QLabel("terca");
	QLabel *quarta = new QLabel("quarta");
	QLabel *quinta = new QLabel("quinta");
	QLabel *sexta = new QLabel("sexta");
	QLabel *sabado = new QLabel("sabado");
	QLabel *domingo = new QLabel("domingo");

	QVBoxLayout *col1 = new QVBoxLayout;
	QHBoxLayout *principal = new QHBoxLayout;

	col1->addWidget(segunda);
	col1->addWidget(terca);
	col1->addWidget(quarta);
	col1->addWidget(quinta);
	col1->addWidget(sexta);
	col1->addWidget(sabado);
	col1->addWidget(domingo);

	principal->addLayout(col1);

	janela->setLayout(principal);
	janela->show();

	return app.exec();
}

Para compilar este código deve proceder da seguinte maneira:

  • Guardar este código num ficheiro de texto dentro de um directório (uma pasta no Desktop faz o efeito), que neste caso vou chamar de qt;
  • Depois, pela linha de comandos, acedemos à pasta como habitual:
$ cd Desktop/qt/1.cpp

Vou chamar ao ficheiro que contém o código: “1.cpp”, e depois para compilar fazemos seguinte:

$ qmake -project

Isto vai criar o ficheiro qt.pro, para de seguida corrermos o código:

$ qmake qt.pro

Isto vai criar o ficheiro “MakeFile”, o próximo código será:

$ make

Só isto vai criar o ficheiro “qt” e podemos compilar como fazemos num ficheiro C/C++:

$ ./qt

De seguida aparecerá uma janela com os dias da semana, alinhados verticalmente.

  • Spacer

O próximo passo será alargar a nossa janela para os lados:

#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTimeEdit>
#include <QHBoxLayout>
#include <QSpacerItem>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QWidget *janela = new QWidget;
	QSpacerItem *spacer1 = new QSpacerItem(400,0);

	QLabel *segunda = new QLabel("segunda");
	QLabel *terca = new QLabel("terca");
	QLabel *quarta = new QLabel("quarta");
	QLabel *quinta = new QLabel("quinta");
	QLabel *sexta = new QLabel("sexta");
	QLabel *sabado = new QLabel("sabado");
	QLabel *domingo = new QLabel("domingo");

	QVBoxLayout *col1 = new QVBoxLayout;
	QHBoxLayout *principal = new QHBoxLayout;

	col1->addWidget(segunda);
	col1->addWidget(terca);
	col1->addWidget(quarta);
	col1->addWidget(quinta);
	col1->addWidget(sexta);
	col1->addWidget(sabado);
	col1->addWidget(domingo);

	principal->addLayout(col1);
	principal->addItem(spacer1);

	janela->setLayout(principal);
	janela->show();

	return app.exec();
}

Isto vai nos dar a mesma janela que a anterior mas alargada para os lados.

  • Spinboxes
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTimeEdit>
#include <QHBoxLayout>
#include <QSpacerItem>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QWidget *janela = new QWidget;
	QSpacerItem *spacer1 = new QSpacerItem(400,0);

	//Criar os objectos
	QLabel *segunda = new QLabel("segunda");
	QLabel *terca = new QLabel("terca");
	QLabel *quarta = new QLabel("quarta");
	QLabel *quinta = new QLabel("quinta");
	QLabel *sexta = new QLabel("sexta");
	QLabel *sabado = new QLabel("sabado");
	QLabel *domingo = new QLabel("domingo");

	QSpinBox *spin1 = new QSpinBox;
	QSpinBox *spin2 = new QSpinBox;
	QSpinBox *spin3 = new QSpinBox;
	QSpinBox *spin4 = new QSpinBox;
	QSpinBox *spin5 = new QSpinBox;
	QSpinBox *spin6 = new QSpinBox;
	QSpinBox *spin7 = new QSpinBox;

	//Layouts
	QVBoxLayout *col1 = new QVBoxLayout;
	QVBoxLayout *col2 = new QVBoxLayout;
	QHBoxLayout *principal = new QHBoxLayout;

	col1->addWidget(segunda);
	col1->addWidget(terca);
	col1->addWidget(quarta);
	col1->addWidget(quinta);
	col1->addWidget(sexta);
	col1->addWidget(sabado);
	col1->addWidget(domingo);

	col2->addWidget(spin1);
	col2->addWidget(spin2);
	col2->addWidget(spin3);
	col2->addWidget(spin4);
	col2->addWidget(spin5);
	col2->addWidget(spin6);
	col2->addWidget(spin7);

	principal->addLayout(col1);
	principal->addLayout(col2);
	principal->addItem(spacer1);

	janela->setLayout(principal);
	janela->show();

	return app.exec();
}

Este passo vai-nos criar as spinboxes, que são as caixinhas com as setas para cima e para baixo, para podermos mudar os números.

  • Sliders
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTimeEdit>
#include <QHBoxLayout>
#include <QSpacerItem>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QWidget *janela = new QWidget;
	QSpacerItem *spacer1 = new QSpacerItem(400,0);

	//Criar os objectos
	QLabel *segunda = new QLabel("segunda");
	QLabel *terca = new QLabel("terca");
	QLabel *quarta = new QLabel("quarta");
	QLabel *quinta = new QLabel("quinta");
	QLabel *sexta = new QLabel("sexta");
	QLabel *sabado = new QLabel("sabado");
	QLabel *domingo = new QLabel("domingo");

	QSpinBox *spin1 = new QSpinBox;
	QSpinBox *spin2 = new QSpinBox;
	QSpinBox *spin3 = new QSpinBox;
	QSpinBox *spin4 = new QSpinBox;
	QSpinBox *spin5 = new QSpinBox;
	QSpinBox *spin6 = new QSpinBox;
	QSpinBox *spin7 = new QSpinBox;

	QSlider *sh1 = new QSlider(Qt::Horizontal);
	QSlider *sh2 = new QSlider(Qt::Horizontal);
	QSlider *sh3 = new QSlider(Qt::Horizontal);
	QSlider *sh4 = new QSlider(Qt::Horizontal);
	QSlider *sh5 = new QSlider(Qt::Horizontal);
	QSlider *sh6 = new QSlider(Qt::Horizontal);
	QSlider *sh7 = new QSlider(Qt::Horizontal);

	//Layouts
	QVBoxLayout *col1 = new QVBoxLayout;
	QVBoxLayout *col2 = new QVBoxLayout;
	QVBoxLayout *col3 = new QVBoxLayout;
	QHBoxLayout *principal = new QHBoxLayout;

	col1->addWidget(segunda);
	col1->addWidget(terca);
	col1->addWidget(quarta);
	col1->addWidget(quinta);
	col1->addWidget(sexta);
	col1->addWidget(sabado);
	col1->addWidget(domingo);

	col2->addWidget(spin1);
	col2->addWidget(spin2);
	col2->addWidget(spin3);
	col2->addWidget(spin4);
	col2->addWidget(spin5);
	col2->addWidget(spin6);
	col2->addWidget(spin7);

	col3->addWidget(sh1);
	col3->addWidget(sh2);
	col3->addWidget(sh3);
	col3->addWidget(sh4);
	col3->addWidget(sh5);
	col3->addWidget(sh6);
	col3->addWidget(sh7);

	principal->addLayout(col1);
	principal->addLayout(col2);
	principal->addLayout(col3);
	principal->addItem(spacer1);

	janela->setLayout(principal);
	janela->show();

	return app.exec();
}

Agora temos os sliders (objectos do lado direito das spinboxes).

  • Botão
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTimeEdit>
#include <QHBoxLayout>
#include <QSpacerItem>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QWidget *janela = new QWidget;
	QSpacerItem *spacer1 = new QSpacerItem(400,0);
	QPushButton *sair = new QPushButton("Sair");

	//Criar os objectos
	QLabel *segunda = new QLabel("segunda");
	QLabel *terca = new QLabel("terca");
	QLabel *quarta = new QLabel("quarta");
	QLabel *quinta = new QLabel("quinta");
	QLabel *sexta = new QLabel("sexta");
	QLabel *sabado = new QLabel("sabado");
	QLabel *domingo = new QLabel("domingo");

	QSpinBox *spin1 = new QSpinBox;
	QSpinBox *spin2 = new QSpinBox;
	QSpinBox *spin3 = new QSpinBox;
	QSpinBox *spin4 = new QSpinBox;
	QSpinBox *spin5 = new QSpinBox;
	QSpinBox *spin6 = new QSpinBox;
	QSpinBox *spin7 = new QSpinBox;

	QSlider *sh1 = new QSlider(Qt::Horizontal);
	QSlider *sh2 = new QSlider(Qt::Horizontal);
	QSlider *sh3 = new QSlider(Qt::Horizontal);
	QSlider *sh4 = new QSlider(Qt::Horizontal);
	QSlider *sh5 = new QSlider(Qt::Horizontal);
	QSlider *sh6 = new QSlider(Qt::Horizontal);
	QSlider *sh7 = new QSlider(Qt::Horizontal);

	//Layouts
	QVBoxLayout *col1 = new QVBoxLayout;
	QVBoxLayout *col2 = new QVBoxLayout;
	QVBoxLayout *col3 = new QVBoxLayout;
	QHBoxLayout *principal = new QHBoxLayout;
	QVBoxLayout *fim = new QVBoxLayout;
	QVBoxLayout *todo = new QVBoxLayout;

	col1->addWidget(segunda);
	col1->addWidget(terca);
	col1->addWidget(quarta);
	col1->addWidget(quinta);
	col1->addWidget(sexta);
	col1->addWidget(sabado);
	col1->addWidget(domingo);

	col2->addWidget(spin1);
	col2->addWidget(spin2);
	col2->addWidget(spin3);
	col2->addWidget(spin4);
	col2->addWidget(spin5);
	col2->addWidget(spin6);
	col2->addWidget(spin7);

	col3->addWidget(sh1);
	col3->addWidget(sh2);
	col3->addWidget(sh3);
	col3->addWidget(sh4);
	col3->addWidget(sh5);
	col3->addWidget(sh6);
	col3->addWidget(sh7);

	principal->addLayout(col1);
	principal->addLayout(col2);
	principal->addLayout(col3);

	fim->addItem(spacer1);
	fim->addWidget(sair);

	todo->addLayout(principal);
	todo->addLayout(fim);

	janela->setLayout(todo);
	janela->show();

	return app.exec();
}

Agora criamos o botão sair, mas ainda n faz nada.

  • Connect: Spinbox ao Slider
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTimeEdit>
#include <QHBoxLayout>
#include <QSpacerItem>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QWidget *janela = new QWidget;
	QSpacerItem *spacer1 = new QSpacerItem(400,0);
	QPushButton *sair = new QPushButton("Sair");

	//Criar os objectos
	QLabel *segunda = new QLabel("segunda");
	QLabel *terca = new QLabel("terca");
	QLabel *quarta = new QLabel("quarta");
	QLabel *quinta = new QLabel("quinta");
	QLabel *sexta = new QLabel("sexta");
	QLabel *sabado = new QLabel("sabado");
	QLabel *domingo = new QLabel("domingo");

	QSpinBox *spin1 = new QSpinBox;
	QSpinBox *spin2 = new QSpinBox;
	QSpinBox *spin3 = new QSpinBox;
	QSpinBox *spin4 = new QSpinBox;
	QSpinBox *spin5 = new QSpinBox;
	QSpinBox *spin6 = new QSpinBox;
	QSpinBox *spin7 = new QSpinBox;

	QSlider *sh1 = new QSlider(Qt::Horizontal);
	QSlider *sh2 = new QSlider(Qt::Horizontal);
	QSlider *sh3 = new QSlider(Qt::Horizontal);
	QSlider *sh4 = new QSlider(Qt::Horizontal);
	QSlider *sh5 = new QSlider(Qt::Horizontal);
	QSlider *sh6 = new QSlider(Qt::Horizontal);
	QSlider *sh7 = new QSlider(Qt::Horizontal);

	//Layouts
	QVBoxLayout *col1 = new QVBoxLayout;
	QVBoxLayout *col2 = new QVBoxLayout;
	QVBoxLayout *col3 = new QVBoxLayout;
	QHBoxLayout *principal = new QHBoxLayout;
	QVBoxLayout *fim = new QVBoxLayout;
	QVBoxLayout *todo = new QVBoxLayout;

	col1->addWidget(segunda);
	col1->addWidget(terca);
	col1->addWidget(quarta);
	col1->addWidget(quinta);
	col1->addWidget(sexta);
	col1->addWidget(sabado);
	col1->addWidget(domingo);

	col2->addWidget(spin1);
	col2->addWidget(spin2);
	col2->addWidget(spin3);
	col2->addWidget(spin4);
	col2->addWidget(spin5);
	col2->addWidget(spin6);
	col2->addWidget(spin7);

	col3->addWidget(sh1);
	col3->addWidget(sh2);
	col3->addWidget(sh3);
	col3->addWidget(sh4);
	col3->addWidget(sh5);
	col3->addWidget(sh6);
	col3->addWidget(sh7);

	QObject::connect(spin1, SIGNAL(valueChanged(int)), sh1, SLOT(setValue (int)));
	QObject::connect(spin2, SIGNAL(valueChanged(int)), sh2, SLOT(setValue (int)));
	QObject::connect(spin3, SIGNAL(valueChanged(int)), sh3, SLOT(setValue (int)));
	QObject::connect(spin4, SIGNAL(valueChanged(int)), sh4, SLOT(setValue (int)));
	QObject::connect(spin5, SIGNAL(valueChanged(int)), sh5, SLOT(setValue (int)));
	QObject::connect(spin6, SIGNAL(valueChanged(int)), sh6, SLOT(setValue (int)));
	QObject::connect(spin7, SIGNAL(valueChanged(int)), sh7, SLOT(setValue (int)));

	QObject::connect(sh1, SIGNAL(valueChanged(int)), spin1, SLOT(setValue (int)));
	QObject::connect(sh2, SIGNAL(valueChanged(int)), spin2, SLOT(setValue (int)));
	QObject::connect(sh3, SIGNAL(valueChanged(int)), spin3, SLOT(setValue (int)));
	QObject::connect(sh4, SIGNAL(valueChanged(int)), spin4, SLOT(setValue (int)));
	QObject::connect(sh5, SIGNAL(valueChanged(int)), spin5, SLOT(setValue (int)));
	QObject::connect(sh6, SIGNAL(valueChanged(int)), spin6, SLOT(setValue (int)));
	QObject::connect(sh7, SIGNAL(valueChanged(int)), spin7, SLOT(setValue (int)));

	principal->addLayout(col1);
	principal->addLayout(col2);
	principal->addLayout(col3);

	fim->addItem(spacer1);
	fim->addWidget(sair);

	todo->addLayout(principal);
	todo->addLayout(fim);

	janela->setLayout(todo);
	janela->show();

	return app.exec();
}

Agora temos as spinboxes, e os sliders ligados, fazendo com que se alterarmos um número de um lado, o outro mude automaticamente para o mesmo.

  • Botão Terminar
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTimeEdit>
#include <QHBoxLayout>
#include <QSpacerItem>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QWidget *janela = new QWidget;
	QSpacerItem *spacer1 = new QSpacerItem(400,0);
	QPushButton *sair = new QPushButton("&Sair");

	//Criar os objectos
	QLabel *segunda = new QLabel("segunda");
	QLabel *terca = new QLabel("terca");
	QLabel *quarta = new QLabel("quarta");
	QLabel *quinta = new QLabel("quinta");
	QLabel *sexta = new QLabel("sexta");
	QLabel *sabado = new QLabel("sabado");
	QLabel *domingo = new QLabel("domingo");

	QSpinBox *spin1 = new QSpinBox;
	QSpinBox *spin2 = new QSpinBox;
	QSpinBox *spin3 = new QSpinBox;
	QSpinBox *spin4 = new QSpinBox;
	QSpinBox *spin5 = new QSpinBox;
	QSpinBox *spin6 = new QSpinBox;
	QSpinBox *spin7 = new QSpinBox;
	spin1->setRange (0, 5);
	spin2->setRange (0, 5);
	spin3->setRange (0, 5);
	spin4->setRange (0, 5);
	spin5->setRange (0, 5);
	spin6->setRange (0, 5);
	spin7->setRange (0, 5);

	QSlider *sh1 = new QSlider(Qt::Horizontal);
	QSlider *sh2 = new QSlider(Qt::Horizontal);
	QSlider *sh3 = new QSlider(Qt::Horizontal);
	QSlider *sh4 = new QSlider(Qt::Horizontal);
	QSlider *sh5 = new QSlider(Qt::Horizontal);
	QSlider *sh6 = new QSlider(Qt::Horizontal);
	QSlider *sh7 = new QSlider(Qt::Horizontal);
	sh1->setRange (0, 5);
	sh2->setRange (0, 5);
	sh3->setRange (0, 5);
	sh4->setRange (0, 5);
	sh5->setRange (0, 5);
	sh6->setRange (0, 5);
	sh7->setRange (0, 5);

	//Layouts
	QVBoxLayout *col1 = new QVBoxLayout;
	QVBoxLayout *col2 = new QVBoxLayout;
	QVBoxLayout *col3 = new QVBoxLayout;
	QHBoxLayout *principal = new QHBoxLayout;
	QVBoxLayout *fim = new QVBoxLayout;
	QVBoxLayout *todo = new QVBoxLayout;

	col1->addWidget(segunda);
	col1->addWidget(terca);
	col1->addWidget(quarta);
	col1->addWidget(quinta);
	col1->addWidget(sexta);
	col1->addWidget(sabado);
	col1->addWidget(domingo);

	col2->addWidget(spin1);
	col2->addWidget(spin2);
	col2->addWidget(spin3);
	col2->addWidget(spin4);
	col2->addWidget(spin5);
	col2->addWidget(spin6);
	col2->addWidget(spin7);

	col3->addWidget(sh1);
	col3->addWidget(sh2);
	col3->addWidget(sh3);
	col3->addWidget(sh4);
	col3->addWidget(sh5);
	col3->addWidget(sh6);
	col3->addWidget(sh7);

	QObject::connect(spin1, SIGNAL(valueChanged(int)), sh1, SLOT(setValue (int)));
	QObject::connect(spin2, SIGNAL(valueChanged(int)), sh2, SLOT(setValue (int)));
	QObject::connect(spin3, SIGNAL(valueChanged(int)), sh3, SLOT(setValue (int)));
	QObject::connect(spin4, SIGNAL(valueChanged(int)), sh4, SLOT(setValue (int)));
	QObject::connect(spin5, SIGNAL(valueChanged(int)), sh5, SLOT(setValue (int)));
	QObject::connect(spin6, SIGNAL(valueChanged(int)), sh6, SLOT(setValue (int)));
	QObject::connect(spin7, SIGNAL(valueChanged(int)), sh7, SLOT(setValue (int)));

	QObject::connect(sh1, SIGNAL(valueChanged(int)), spin1, SLOT(setValue (int)));
	QObject::connect(sh2, SIGNAL(valueChanged(int)), spin2, SLOT(setValue (int)));
	QObject::connect(sh3, SIGNAL(valueChanged(int)), spin3, SLOT(setValue (int)));
	QObject::connect(sh4, SIGNAL(valueChanged(int)), spin4, SLOT(setValue (int)));
	QObject::connect(sh5, SIGNAL(valueChanged(int)), spin5, SLOT(setValue (int)));
	QObject::connect(sh6, SIGNAL(valueChanged(int)), spin6, SLOT(setValue (int)));
	QObject::connect(sh7, SIGNAL(valueChanged(int)), spin7, SLOT(setValue (int)));

	QObject::connect(sair, SIGNAL(clicked()), &app, SLOT(quit()));

	principal->addLayout(col1);
	principal->addLayout(col2);
	principal->addLayout(col3);

	fim->addItem(spacer1);
	fim->addWidget(sair);

	todo->addLayout(principal);
	todo->addLayout(fim);

	janela->setLayout(todo);
	janela->show();

	return app.exec();
}

O programa já fazia tudo, menos o botão sair que agora, quando clicado termina mesmo o programa.

Programar em C- usando ficheiros de texto

Este blog vai começar por um tópico, não ideal para quem ainda não deu os primeiros passos na área de programação, que é, manipulação de ficheiros. Pelo que este blog destina-se a programadores com algum conhecimento nesta área.

Neste tópico vou tratar das seguintes funções:

fgetc/ fputc;

fprintf/ fscanf;

fwrite/ fread;

Comecemos pelo fputc, seguido do fgetc;

#include<stdio.h>
int main(){
	FILE *fp=fopen("dados.txt", "w");
	char caracter;
	caracter=fgetc(fp);
	printf("caracter= ");scanf("%c", &caracter);
	fputc(caracter, fp);
	fclose(fp);

	return 0;
}

Este programa cria um ficheiro (mesmo que ele já exista) e coloca-lhe lá dentro uma letra dada pelo utilizador.

#include<stdio.h>
int main(){
	FILE *fp=fopen("dados.txt", "r");
	char caracter;
	caracter=fgetc(fp);
	printf("%c\n", caracter);
	fclose(fp);

	return 0;
}

Neste exemplo o programa lê do ficheiro o primeiro carácter, se esta função fosse feita dentro de um ciclo, esta iria ler letra a letra, uma depois da outra.

Agora o fprintf, e o fscanf:

#include<stdio.h>
int main(){
	FILE *fp=fopen("dados.txt", "w");
	int a=1, b=2, c=3;
	fprintf(fp, "%d %d %d", a, b, c);
	fclose(fp);

	return 0;
}

Neste exemplo o programa cria o ficheiro e coloca la dentro os 3 dados, tal como na linha de printfestá descrito.

#include<stdio.h>
int main(){
	FILE *fp=fopen("dados.txt", "r");
	int a, b, c;
	fscanf(fp, "%d %d %d", &a, &b, &c);
	printf("%d %d %d\n", a, b, c);
	fclose(fp);

	return 0;
}

Neste exemplo, o programa vai ao ficheiro criado no exemplo anterior e lê os 3 dados lá guardados.

E para finalizar, o fwrite, fread, que escreve os dados em forma binária, pelo que se tentar ler os dados abrindo o ficheiro, não conseguirá ler os dados:

#include<stdio.h>
int main(){
	FILE *fp=fopen("dados.txt", "w");
	int a[3]={1, 2, 3};
	fwrite(a, sizeof(int), 3, fp);
	fclose(fp);

	return 0;
}

O programa cria o ficheiro e introduz os valores lá dentro.

#include<stdio.h>
int main(){
	FILE *fp=fopen("dados.txt", "rb");
	int a[3];
	fread(a, sizeof(int), 3, fp);
	printf("%d %d %d\n", a[0], a[1], a[2]);
	fclose(fp);

	return 0;
}