Preliminars

Continguts:

Introducció
Widgets de QT
Signals i Slots
Disposició dels widgets (classe Layout)
QT Designer
Enllaços d'interès

 

Introducció

Abans de començar a crear un projecte d'exemple de QT pas per pas, serà necessari explicar alguns conceptes propis de la llibreria QT:

  1. Què s'entèn per widget.
  2. El mecanisme de comunicació de Signals -> Slots.
  3. La disposició dels widgets sobre un layout.

Tornar als continguts


Widgets de QT

En QT tot són widgets. Qualsevol objecte que apareix en la pantalla és un widget.
El que es vol dir és que no existeix el concepte de controls, finestres, botons... a cadascun d'aquests termes se'ls anomena widgets. És a dir, un botó, un menú, una etiqueta, una barra d'eines, una icona... tot són widgets.
Ara bé, de widgets n'hi ha de molts tipus i cadascun té les seves propietats; algunes d'elles comunes a tots els widgets, i altres específiques depenent de la classe a la qual pertanyen.
A continuació podem veure alguns widgets de QT:

Widget
Figura
QPushButton
QComboBox
QSlider
QScrollBar
QSpinBox
QCheckBox
QProgressBar

QTable
QListView

 

Tornar als continguts


Signals i Slots

És un dels punts més importants dins la programació d'aplicacions basade en QT.
Es tracta del mecanisme de comunicació entre els diferents objectes que utilitza la llibreria QT.

Quan canvia un widget, ens interessa notificar aquest canvi a un altre widget a fi que es realitzi alguna acció. Per exemple, si l'usuari tanca un determinat botó (widget de tipus botó) és possible que vulguem que es tanqui una determinada finestra, és a dir, que s'executi una funció de tancarFinestra().
Tenim llavors que un Signal és emès del widget botó cap al widget finestra i que en aquest segon hi haurà un Slot que recollirà aquest Signal i executarà la funció pertinent.
S'ha de dir que existeix la possibilitat que múltiples Slots estiquin connectats a un mateix Signal. Llavors s'executaran tots els Slots l'un darrere l'altre en un ordre arbitrari.

En la següent figura podem veure un diagrama de la connexió de Signals i Slots:

Tornar als continguts


Disposició dels widgets (classe Layout)

A l'hora de crear la finestra d'una aplicació (fitxers .ui) ho podem fer de dos maneres diferents:

  1. Utilitzant l'eina QT Designer.
  2. "A mà" mitjançant funcions de la llibreria QT

Tant si es fa d'una manera o de l'altra, el que s'està fent és crear un widget pare i a partir d'aquí anar-li col.locant widgets fills (que alhora poden ser pares d'altres widgets). Per exemple primer es crea la finestra principal d'una aplicació i després hi anem afegint diferents elements (widgets) a sobre: botons, etiquetes, barres d'eines...
El que interessa és que tots aquests widgets estiguin ben disposats, és a dir, estiguin correctament alineats, es redimenssionin al canviar la mida de la finestra, etc.
Per aconseguir aquest fet, QT es basa en l'ús de la classe Layout QLayout i en particular de les seves tres subclasses QHBoxLayout, QVBoxLayout i QGridLayout.

Tal com s'ha dit, a l'hora de dissenyar una finestra ho podem fer "a mà" o amb el QT Designer. Cal dir que és recomanable fer-ho amb l'eina QT Designer si no es té molta experiència en el maneig de Layouts, i tot i així és més ràpid i intuitiu utilitzar el QT Designer per realitzar qualsevol canvi i després compilar-ho amb el QDevelop que fer-ho a mà.
A continuació veurem la disposició gràfica al posicionar 5 widgets (tots botons QPushButton) sobre un layout depenent del seu tipus. També veurem quin seria el codi font per crear-ho si es vulgués fer a mà:

Veiem el codi necessari per fer-ho:

/*Creació del widget i botons*/
QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

/*Creació del layout i addició dels botons*/
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

window->setLayout(layout);
window->show();

El codi necessari és idèntic a l'anterior excepte en la creació del layout, que ara serà del tipus QVBoxLayout:

/*Creació del widget i botons*/
QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

/*Creació del layout i addició dels botons*/
QHBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

window->setLayout(layout);
window->show();

Veiem el codi:

/*Creació del widget i botons*/
QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

/*Creació del layout i addició dels botons*/
QGridLayout *layout = new QGridLayout;
layout->addWidget(button1, 0, 0);
layout->addWidget(button2, 0, 1);
layout->addWidget(button3, 1, 0, 1, 2);
layout->addWidget(button4, 2, 0);
layout->addWidget(button5, 2, 1);

window->setLayout(layout);
window->show();

Un cop vistes les 3 disposicions possibles, es pot fer tota mena de combinacions disposant els widgets de la forma que es cregui més convenient.

Tornar als continguts

QT Designer

És una aplicació creada per Trolltech per dissenyar interfícies gràfiques d'usuari (GUI) amb components de QT. Ens permet dissenyar widgets i diàlegs de forma senzilla.
En la següent imatge podem veure l'estructura de l'aplicació:

A la part esquerra hi tenim els diferents widgets (que passaran a ser widgets fills de la finestra principal) que podem utilitzar i que només ens caldrà arrossegar dins la finestra de l'aplicació que estiguem dissenyant. A la part central hi tenim la finestra que esiguem disssenyant. I a la part dreta hi tenim una sèrie de finestres que fan referència a les propietats d'un determinat widget amb el qual estiguem treballant, una altra amb la que podem modificar els Signals/Slots, una altra que ens permet treballar amb un fitxer de recursos...

A grans trets, amb el QT Designer farem el següent:

  1. Col.locar els widgets dins la finestra principal i modificar-ne algunes propietats.
  2. Col.locar-ho tot utilitzant els layouts segons la disposició que ens interessi.
  3. Opcionalment establirem un ordre per quan es prem la tecla tab.
  4. Establir les connexions de Signals i Slots. Cal dir que també ho podem fer quan fem la implementació de l'aplicació.

Tornar als continguts

 

Enllaços d'interès

Tornar als continguts

 


Josep Ramon Benet Bitrià
2008