Partea a-IV-a: Proiectarea paginilor de configurare
Un dialog tipic KDE are citeva iconite in stinga, o pagina (activa) in dreapta si
citeva butoane in josul dialogului. Iata de exemplu dialogul de preferinte al KTouch:
Urmatoarea imagine va arata widget-ul corespunzator al paginii de configurare
(creat in QT Designer):
Widget-ul din QT Designer arata o bara de titlu, dar cind widget-ul va fi
inglobat in dialogul de configurare bara de titlu va disparea si va fi afisat doar continutul
widget-ului.
Acum pagina de configurare va fi creata inaintea dialogului, ceea cea
vom face si noi acum. In Kdevelop din selectati itemul "Fisier" -> "Nou" si selectati
"Widget (.ui)". Dialogul cere un nume pentru noul widget si ar trebui sa introduceti "prefgenerallayout" FARA .ui (va fi adaugat automat). Citeva remarci cu privire la numele folosit.
- Numele fisierului incepe cu "pref" deoarece va fi parte al dialogului de
preferinte
- In mijloc este "general" deoarece va fi pagina cu optiunile
"Generale (General)"
- Si la final "layout" (aranjare grafica), deoarece noi vom aranja grafic
cu QT Designer widget-ul si toata functionalitatea va fi scrisa intr-o
clasa derivata din acest "layout"
Inainte de toate haideti sa continuam cu adaugarea fisierului .ui la proiect.
Va fi afisat urmatorul dialog. Nu trebuie decit sa-l confirmati:
Dupa ce apasati "OK", QT Designer va deschide fisierul si veti avea un widget gol cu care
va puteti juca.
Fara KDevelop: |
 |
 |
 |
|
Puteti de altfel sa deschideti QT Designer, sa creati un nou widget si sa
il salvati in subdirectorul src cu numele prefgenerallayout.ui.
Acum trebuie doar sa adaugati acest fisier in linia cu fisierele sursa din fisierul
Makefile.am cum ati facut mai sus.
Asta este ce face KDevelop pentru dumnevoastra.
|
|
Haideti sa schimbam citeva proprietati ale widget-ului:
- name: PrefGeneralLayout
- caption: General (este optional deoarece nu va fi folosit,
dar va ajuta sa il observati mai usor printre alte widget-uri)
Acum incepeti prin a adauga citeva widget-uri in pagina. In exemplul nostru avem nevoie
doar sa afisam un text, deci vom folosi widget-ul KLineEdit pentru a edita textul si
QLabel pentru a afisa ce vrem sa editam. Mai puneti si un cadru
in jurul optiunilor, ca sa arate frumos. Inainte de a fixa layout-ul, pagina ar trebui sa arate
cam asa:
Citeva comentarii cu privire la numele widget-urilor:
- In general ar trebui schimbate doar numele widget-urilor care trebuie
modificate mai tirziu (din cod), asa ca in cazul acesta vom modifica doar denumirea widget-ului
KLineEdit.
- Numiti-le ca in cazul variabilelor membru, ar trebui compuse din continut
si tip, asa ca pentru linia de editare propun m_textEdit. Asta bineinteles ca este o
recomandare, dar daca urmati aceste simple conventii veti scuti timp cind cautati un nume de
widget mai tarziu. Daca ar trebui sa schimbati continutul unui widget care ar trebui
sa reprezinte proprietatea m_text si ne amintim ca acel widget este
KLineEdit putem deja sa ghicim numele: m_text+Edit=m_textEdit. Poate in viitor
KDevelop va avea o optiune de completare automata mai puternica, care ne va arata toate
widget-urile, dar pina atunci conventia de mai sus va va ajuta.
Acum vom contura aranjarea in pagina (layout). Pentru mai multe informatii va recomand
sa cititi documentatia QT, unde aranjarea in pagina este descrisa in detaliu. Trebuie sa ne decidem
daca frame-ul ar trebui sa se mareasca cind widget-ul se mareste sau daca ar trebui sa se opreasca
la o lungime minima pe verticala si spatiul de sub el sa se mareasca. Am decis sa pun un
spatiator (spacer - obiect care spatiaza)
sub cadru, asa ca daca se mareste pe verticala cadrul va sta la marime minima pe verticala. Iata in final
procedura de a crea aranjarea:
- clic dreapta pe cadru (frame) si alegeti "Lay Out Vertically"
(cadrul se va micsora la minimul posibil)
- inserati un spatiator (iconita in forma de resort) sub cadru
- dati clic dreapta pe widget si alegeti "Lay Out Vertically"
(cadrul va creste pe orizontala la maxim si spatiatorul va creste pina va umple spatiul
ramas sub cadru).
Cu aceste setari ale aranjarii puteti crea foarte usor aranjamente mult mai complexe
(incercati sa folositi facilitatea de previzualizare din QT Designer).
Mai este un singur lucru de facut. Cind ati adaugat un aranjamentul la widget ati observat
ca au mai aparut doua proprietati noi in fereastra de proprietati (selectati widget-ul
dind clic undeva unde nu este nimic, in afara cadrului). Trebuie sa setati proprietatea
layoutMargin la 0, altfel widget-ul va avea o margine
care nu va arata prea frumos in dialogul de preferinte. Pagina finala ar trebui sa arate cam asa:
Acum salvati widget-ul si inchideti QT Designer (in caz ca aveti mai multe instante ale QT Designer
cu acelasi widget, aveti grija pe care il salvati).
Acum in KDevelop trebuie doar sa executati make (apasati butonul) si observati cum fisierul
prefgenerallayout.h este generat automat din fisierul .ui (folosind programul uic)
si un altul numit prefgenerallayout.cpp care va fi compilat.
Fara KDevelop: |
 |
 |
 |
|
Cind veti executa make dupa ce ati adaugat fisierul .ui in
Makefile.am va fi generat automat noul antet si noul fisier sursa pe care va fi compilat.
La fel cum ati apasa butonul de compilare din KDevelop.
|
|
Pentru practica (si pentru ca ne va folosi) mai adaugam inca o pagina de configurare numita
prefstylelayout.ui si vom construi pagina (al carei nume va fi PrefStyleLayout)
care va arata ca in urmatoarea imagine:
Cele trei widget-uri care le vom folosi mai tirziu sint:
- Un KColorButton numit "m_colorBtn"
- Un KPushButton numit "m_fontBtn"
- Un QLabel numit "m_fontLabel"
Acum incercati sa realizati acest widget singuri (ar fi cel mai bine) sau urmati instructiunile de
mai jos.
- creati un cadru cu proprietatile frameShape=Box si frameShadow=Sunken
- creati doua etichete QLabel in interiorul cadrului si ca text puneti
"Text color:" si "Font:"
- creati doua spatiatoare QSpacer orizontale pentru fiecare linie
- setati "size policy" la cele din stinga la valoarea "fixed"
- creati un KColorButton si numiti-l "m_colorBtn"
- creati un KPushButton si numiti-l "m_fontBtn" si ca eticheta il
setati la "Choose..."
- aliniati etichetele, spatiatoarele si butoanele in rinduri si coloane
(imaginati-va un tabel)
- dati clic dreapta in cadru si alegeti "Lay Out in a Grid".
Cadrul ar trebui sa se micsoreze si widget-urile ar trebui sa se aranjeze intr-un tabel.
Daca nu s-a intamplat asa, dati clic dreapta pe cadru, selectati "Break Layout", rearanjati
butoanele, spatiatoarele si etichetele si recreati aranjamentul in tabel, pina cind va arata bine.
- mariti cadrul un pic, dupa care dati clic dreapta si alegeti "Break Layout"
- adaugati o eticheta QLabel sub cele 8 widget-uri (care ar trebui sa fie
deja aranjate frumos).
- numiti eticheta "m_fontLabel" si schimbati-i urmatoarele proprietati
- paletteBackgroundColor -> selectati alb
- frameShape=Box
- text="abcdefg ABCDEFH 0123456789" (sau ce doriti)
- hAlign=AlignHCenter
- mariti eticheta astfel incit sa fie la fel de lata cit widget-urile de
deasupra la un loc
- creati aranjamentul (layout-ul) in cadru inca o data
- adaugati un spatiator vertical sub cadru
- creati un aranjament vertical in widget
- setati variabila layoutMargin la 0
- salvati widget-ul
Dupa ce ati creat si pagina a doua puteti recompila proiectul (ar trebui sa rezulte fisierul
prefstylelayout.h)
Inainte de a ajunge la partea in care vedem ceva, trebuie create doua clase PrefGeneral si
PrefStyle, amindoua sint copiii aranjamentelor create in ultima parte. Puteti crea clasele
folosind vrajitorul "New Class" (clasa noua).
si creati o clasa PrefGeneral (introduceti textul in linia de editare cu eticheta "name") care
este o clasa fiu al QWidget (bifati optiunea din casuta de optiuni) si derivati-o din
PrefGeneralLayout (introduceti textul in linia de editare cu eticheta "Base class").
Vrajitorul va genera doua fisiere: prefgeneral.h si prefgeneral.cpp.
#ifndef PREFGENERAL_H
#define PREFGENERAL_H
#include <qwidget.h>
#include <prefgenerallayout.h>
/// Aceasta este implementarea paginii "General options"
/// din dialogul de preferinte
class PrefGeneral : public PrefGeneralLayout {
Q_OBJECT
public:
/// Constructorul implicit
PrefGeneral(QWidget *parent, const char *name=0, WFlags f=0);
};
#endif // PREFGENERAL_H
prefgeneral.h
#include "prefgeneral.h"
#include "prefgeneral.moc"
PrefGeneral::PrefGeneral(QWidget *parent, const char *name, WFlags f)
: PrefGeneralLayout(parent, name, f)
{
// DE FACUT: initializarea widget-urilor
}
prefgeneral.cpp
Fara KDevelop: |
 |
 |
 |
|
Creati manual cele doua fisiere (si salvati-le in subdirectorul src).
Ca de obicei trebuie adaugat fisierul CPP in Makefile.am si ar trebui sa se compileze fara
probleme.
|
|
Fisierele de mai sus arata foarte diferit de cele generate de vrajitor pentru ca am facut mici modificari:
- comentariile implicite au fost inlocuite cu ale mele
- am scos destructorul (nu ne foloseste)
- constructorul are argumente implicite pentru name si wflags
- fisierul "prefgeneral.moc" este inclus sus (vedeti lamuririle pe care le-am dat in
partea I).
Acelasi lucru trebuie facut si cu PrefStyleLayout. Trebuie sa creati o clasa fiu cu
numele PrefStyle. Puteti face acest lucru singuri sau folositi proiectul:
settingstutorial-03.tar.gz
|