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.