Qt Designer si KDevelop 3.0 pentru īncepatori Anne-Marie Mahfouf Traducerea capitolelor 1-3 īn limba romāna: Laura Afrasinei Corectura traducerii, traducerea capitolelor 4-8 si conversia la DocBook-XML: Claudiu Costin Versiune 0.4 (2003-08-01) Copyright © 2001, 2003 Anne-Marie Mahfouf Este permis? copierea, distribuirea ?i/sau modificarea acestui document īn termenii Licen?ei Documenta?iei Libere GNU (GNU Free Documentation License), versiunea 1.1 sau orice alt? versiune ulterioar? publicat? de Free Software Foundation; f?r? Sec?iuni Invariante, f?r? Textele Copertei Anterioare ?i f?r? Textele Copertei Posterioare. O copie a acestei licen?e este inclus? īn sec?iunea intitulat? "Licen?a Documenta?iei Libere GNU". Qt este un set de biblioteci software utilizat de proiectul KDE pentru dezvoltarea de aplicatii grafice. Acest document prezinta unui programator īncepator cum sa creeze o aplicatie simpla cu ajutorul Qt Designer 3.2 (sau 3.3) si KDevelop 3.0. Tutorialul de fata este bazat pe o aplicatie scrisa de Jono Bacon si a fost revizuita de Daniel Molkentin (pentru KDevelop versiunea 2) si Thomas Nagy. _________________________________________________________________ Cuprins 1. Introducere 2. Cerinte Cum puteti obtine Qt Designer De la distribuitorul dumneavoastra Arhiva cu codul sursa sau SVN anonim Cum puteti obtine KDevelop 3 De la distribuitorul dumneavoastra Arhiva cu codul sursa SVN ramura trunk Lexicon 3. Crearea aplicatiei Īnceperea proiectului Crearea cadrului de lucru cu KDevelop Utilizarea Qt Designer Proiectarea programului Adaugarea de widget-uri Spatierea widget-urilor Semnale si sloturi Generarea codului sursa Implementarea slotului 4. Pe scurt 5. Internationalizarea unui proiect KDE simplu Instalati o versiune de gettext modificat pentru KDE Pregatiti traducerile Traduceti mesajele Compilati si instalati cataloagele de mesaje Referinta 6. Cīteva sfaturi generale Sfaturi generale Numele aplicatiei dumneavoastra Stil de programare Importarea proiectului dumneavoastra īn SVN-ul KDE Cum sa distribui codul sursa ca pachet arhiva? Resurse utile 7. Generarea codului sursa (alta metoda) Fara a folosi functionalitatea de subclasare din KDevelop Implementarea slotului 8. Multumiri si licenta Cap. 1. Introducere Pentru a face ceva util cu ajutorul Qt Designer, vom construi un program simplu care va va arata puterea Qt Designer si a KDevelop. Speram ca acest articol sa va ajute sa creati prima dumneavoastra aplicatie reala KDE. Daca sīnteti deja familiarizati cu KDevelop si Qt Designer si doriti doar sa stiti cum functioneaza acestea īmpreuna, treceti direct la ultimul capitol unde este explicata pe scurt procedura. KDevelop va va ajuta sa realizati o aplicatie KDE completa. Proiectul KDE foloseste ca utilitare Autoconf si Automake, iar KDevelop va va furniza fisierele necesare (directorul admin si fisierele Makefile.cvs, Makefile.am ...). Cap. 2. Cerinte Cuprins Cum puteti obtine Qt Designer De la distribuitorul dumneavoastra Arhiva cu codul sursa sau SVN anonim Cum puteti obtine KDevelop 3 De la distribuitorul dumneavoastra Arhiva cu codul sursa SVN ramura trunk Lexicon Pentru acest tutorial trebuie sa aveti instalate Qt Designer si KDevelop, precum si bibliotecile KDE 3.2.x. Vom realiza un program KDE3 simplu care ia un nume, o adresa de e-mail, un comentariu si genereaza o semnatura virtuala pentru un e-mail. Cum puteti obtine Qt Designer De la distribuitorul dumneavoastra Qt Designer face parte din pachetul qt-3.2.x. Daca aveti o versiune mai veche de Qt instalata pe sistemul dumneavoastra, ar trebui sa instalati cel putin versiunea mentionata mai sus. La momentul scrierii articolului cea mai recenta versiune era 3.2.2. Verificati daca aveti instalate toate pachetele Qt. Pentru a putea compila acest tutorial aveti nevoie si de fisierele antet Qt. Acestea sīnt de regula incluse īn pachetul pentru dezvoltare de software. De asemenea trebuie sa va asigurati ca aveti si Qt Designer. Uneori acesta livrat ca pachet separat. Pentru a verifica daca aveti toate acestea, executati locate qstring.h Daca este afisat /usr/lib/qt3/include/qstring.h, atunci puteti seta variabila QTDIR la /usr/lib/qt3. Folosind un intrepretor de comenzi bash, tastati export QTDIR=/usr/lib/qt3 Arhiva cu codul sursa sau SVN anonim Puteti descarca arhiva cu codul sursa de pe site-ul de web Trolltech sau puteti obtine modulul qt-copy din SVN-ul KDE. Retineti ca Qt pentru Linux este licentiat GPL. Pentru a afla cum sa folositi SVN KDE īn mod anonim, cum sa obtineti si sa compilati modulul qt-copy si pe cele KDE, gasiti aici o documentatie mult mai cuprinzatoare. Apoi trebuie sa setati variabila de mediu QTDIR. Aceasta ar trebui sa indice directorul īn care ati instalat Qt. Pentru un interpretor de comenzi bash ar trebui sa tastati export QTDIR=/usr/local/qt, /usr/local/qt fiind directorul īn care ati instalat Qt. Pentru mai multe detalii cititi fisierul INSTALL. Apoi compilati-l folosind urmatoarele comenzi, linia de compilare recomandata fiind: $ ./configure -system-zlib -qt-gif -system-libpng -system-libjpeg \ -plugin-imgfmt-mng -thread -no-exceptions -debug -fast $ make Comanda make install nu este necesara. Qt Designer se afla īn directorul bin al celui de instalare a Qt. Īl puteti porni tastīnd /usr/local/qt/bin/designer īntr-o consola. Aici gasiti explicatii detaliate privind compilarea Qt din surse. Cum puteti obtine KDevelop 3 De la distribuitorul dumneavoastra KDevelop 3 ar trebui sa faca parte din distributia dumneavoastra de Linux. Versiunile anterioare ale acestuia au fost denumite Gideon, dar īn momentul de fata sīnt depasite. Daca nu gasiti KDevelop 3 distribuit astfel, cititi urmatoarea sectiune pentru a afla cum sa-l obtineti si sa-l compilati. Arhiva cu codul sursa KDevelop poate fi descarcat de pe site-ul KDevelop, din sectiunea Download folosind cel mai apropiat site oglinda. La momentul scrierii articolului, cea mai recenta versiune de cod sursa KDevelop 3.0 era 3.0.4. Ultimele pachete sīnt kdevelop-3.0.4.tar.bz2. Le puteti descarca de aici. Pentru a compila KDevelop 3 aveti nevoie de: qt-3.1.0 sau unul mai recent si de kdelibs-3.1.0 sau mai recent. Variabilele de mediu QTDIR si KDEDIR ar trebui sa conduca la aceste directoare. Nu uitati sa stabiliti caile pentru KDE si Qt. Cele mai frecvente erori īn folosirea KDevelop provin de la variabile de mediu neinitializate corespunzator. Verificati īntr-o consola executīnd comanda set pentru a vedea toate variabilele de mediu. Ar trebui sa setati variabila de mediu PATH precum si LD_LIBRARY_PATH: $ export LD_LIBRARY_PATH=$QTDIR/bin:$KDEDIR/bin:$PATH $ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH Daca īntīmpinati orice fel de problema īn a face KDevelop sa functioneze, accesati sectiunea Forum de site-ul KDevelop pentru a gasi raspuns la problema dumneavoastra. Daca nu ati mai utilizat KDevelop, pentru a va obisnui cu interfata si iconitele, īncercati sa creati un proiect nou pe care sa īl compilati. SVN ramura trunk Aceasta este o scurta sectiune pentru cei ce doresc ultima versiune de KDevelop. Īntr-adevar, KDevelop din SVN merita descarcat. Aveti nevoie de qt-3.2.3 si kdelibs-3.1.0 sau versiuni mai recente. $ mkdir KdevelopSVN $ cd KDevelopSVN $ svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdevelop $ cd kdevelop $ svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kde-common/admin Cīnd transferul s-a terminat: make -f Makefile.cvs ./configure --prefix='kde-config --prefix' make make install # ca root Cititi apoi si instructiunile de compilare de pe site-ul KDevelop. Lexicon * Widget: element al unei interfete grafice cum ar fi o fereastra, un buton sau o casuta text, o bara de defilare, un meniu etc. Dupa cum ati observat, unele widget-uri contin alte widget-uri (bara de defilare spre exemplu). Din punct de vedere al programarii trebuie sa va gīnditi ca toate widget-urile specializate mostenesc o clasa de baza widget, care este clasa QWidget. * Managementul layout-ului: acest termen descrie modul īn care widget-urile sīnt aranjate īntr-o fereastra. Īn cea mai simpla forma, elementele sīnt plasate pe o anumita pozitie, fiindu-le atribuita a anumita īnaltime si lungime. Dar atunci cīnd utilizatorul modifica dimensiunile ferestrei widget-urile ar trebui sa-si mentina pozitia, modificīndu-si totodata si marimea īn mod corespunzator. Qt realizeaza acest lucru prin folosirea de layout-uri īn care sīnt plasate widget-urile. * Semnale si sloturi: sīnt folosite pentru comunicatia dintre obiecte. Mecanismul semnal/slot este o trasatura principala a Qt. Semnalele sīnt emise de obiectele ce-si schimba starea īntr-un mod ce ar putea interesa utilizatorul. Sloturile pot fi folosite pentru a primi semnale, dar sīnt functii componente obisnuite. Se pot conecta oricīte semnale la un singur slot, iar un semnal poate fi conectat la oricīte sloturi. Pentru mai multe detalii puteti citi documentatia TrollTech referitoare la semnale si sloturi. Īn cuprinzatoarea documentatie online ce īnsoteste Qt-ul, veti gasi semnale si sloturi publice care se potrivesc fiecarei clase īn parte. Astfel, va puteti implementa propriile sloturi. Cap. 3. Crearea aplicatiei Cuprins Īnceperea proiectului Crearea cadrului de lucru cu KDevelop Utilizarea Qt Designer Proiectarea programului Adaugarea de widget-uri Spatierea widget-urilor Semnale si sloturi Generarea codului sursa Implementarea slotului Īnceperea proiectului Crearea cadrului de lucru cu KDevelop Cadrul de lucru pe care se va baza proiectul nostru (exemplu: fereastra principala) poate fi realizat rapid si cu usurinta folosind KDevelop. Deschideti KDevelop si selectati optiunea New Project din meniul Project. Va aparea Application Wizard. Alegeti C++->KDE->Simple KDE Application. Completati spatiile libere cu numele proiectului (SigCreate), numele dumneavoastra ca autor, adresa dumneavoastra de e-mail. _________________________________________________________________ Expert aplicatie Expert aplicatie _________________________________________________________________ Dati clic pe butonul Next, verificati optiunile SVN si modelele de antet. Apoi dati clic pe Finish. KDevelop va crea toate fisierele de care aveti nevoie pentru a va compila proiectul. Puteti folosi selectorul de fisiere pentru a vedea codurile celor trei fisiere si anume: main.cpp, sigcreate.cpp si sigcreate.h. _________________________________________________________________ Editorul de fisiere KDevelop Editorul de fisiere KDevelop _________________________________________________________________ Dupa ce Application Wizard a creat aplicatia, compilati-o pentru a va asigura ca totul este īn regula. Pentru a face acest lucru selectati Build->Run automake & friends si apoi Build->Run configure. Fereastra de mesaje ar trebui sa afiseze: " Good - your configure finished. Start make now * * *** Success *** astfel īncīt puteti utiliza make cu Build->Project (sau F8). Apoi Build->Install si Build->Execute programme (sau F9). Rezultatul este afisat īn imaginea de mai jos. _________________________________________________________________ Aplicatie KDE simpla Aplicatie KDE simpla _________________________________________________________________ Acum aveti cadrul de lucru functional si sīnteti gata sa dezvoltati programul. Daca KDevelop nu recunoaste variabilele QTDIR si KDEDIR atunci le puteti seta pe acestea īn Project->Project options (din Configure Options). Utilizarea Qt Designer Qt Designer este un instrument pentru proiectarea si implementarea interfetelor grafice. Va ajuta sa aranjati widget-urile īntr-o forma si sa adaugati un layout corespunzator astfel īncīt interfetei dumneavoastra sa i se poata modifica dimensiunile. Pentru detalii este recomandabil sa cititi manualul Qt Designer. Qt Designer are un editor de text, dar vom folosi KDevelop pentru a modifica codul sursa. Vom crea acum interfata aplicatiei folosind Qt Designer. O forma din Qt Designer este salvata cu extensia .ui pentru ca īn acest mod este procesat de programul uic pentru a genera fisiere .h si .cpp. KDevelop realizeaza toate acestea, dumneavostra netrebuind decīt sa creati forma. Notć De fiecare data cīnd adaugati sau stergeti un fisier (acum vom adauga un fisier .ui) din proiectul KDevelop, fisierul Makefile.am va fi modificat. KDevelop face singur acest lucru, dar va trebui ca dumneavoastra, dupa astfel de schimbari, sa executati Run automake & friends. Īn KDevelop selectati meniul File->New si apoi completati datele necesare īn fereastra care va apare. Īntīi scrieti numele fisierului: sigcreatedlg si alegeti ce fisier nou doriti īn lista derulanta: aici vom alege un widget (.ui). Asigurati-va ca optiunea Add to project este bifata, aceasta asigurīnd actualizarea fisierului Makefile.am. _________________________________________________________________ Adaugarea unui fisier .ui Adaugarea unui fisier .ui _________________________________________________________________ Dati clic pe OK si va apare fereastra Automake Manager. _________________________________________________________________ Automake manager Automake manager _________________________________________________________________ Apasati din nou OK. Daca fisierul sigcreatedlg.ui nu este deschis īn Qt Designer, accesati Automake Manager, dati clic dreapta pe fisier si selectati Open with, alegīnd apoi Qt Designer. Notć Referitor la denumire: este o idee buna sa terminati numele ferestrei de dialog sau al formei īn dlg pentru a conferi lizibilitate celor ce doresc sa verifice codul sursa. sigcreatedlg arata faptul ca este un dialog, o clasa de interfata. Īn mod obisnuit numele de clase KDE īncep cu K (majuscula), urmate de denumirea care descrie cel mai īn detaliu continutul programului dumneavoastra. Daca era o aplicatie KDE reala, denumirea aleasa ar fi trebuit sa fie KSigCreate. _________________________________________________________________ Qt Designer Qt Designer _________________________________________________________________ Interfata Qt Designer este īmpartita īn trei zone. Īn stīnga se gaseste bara de control unde de exemplu puteti selecta widget-urile. Īn zona din dreapta pot fi selectate diferite dialoguri, īnsa vom pastra doar Property Editor, īnchizīndu-le pe celelalte doua. Widget-urile pot fi ajustate pentru a le folosi asa cum doriti. Aici puteti alege dimensiunea acestora, fundalul (paleta de culori) etc. Īntre cele doua ferestre se afla forma care este fereastra efectiva a programului, īn interiorul careia veti crea interfata grafica. Notć Dupa adaugarea sigcreatedlg.ui, īnainte de a construi programul, va trebui sa rulati Automake & friends, precum si Run configure. Aceste proceduri asigura actualizarea fisierului Makefile.am. Proiectarea programului De fiecare data cīnd doriti sa utilizati Qt Designer trebuie sa aveti o reprezentare coerenta a interfetei pe care doriti sa o realizati. Īn figura de mai jos puteti vedea cum va arata programul. Este o fereastra cu un numar de obiecte (sau widget-uri) astfel īncīt utilizatorul sa completeze casutele text cu informatiile corespunzatoare. Din punctul de vedere al utilizatorului programul trebuie sa fie cīt mai usor de utilizat. _________________________________________________________________ Programul de creat Programul de creat _________________________________________________________________ Aplicatia creeaza o semnatura de e-mail care va fi afisata pe ecran. Utilizatorul trebuie sa introduca numele, adresa de e-mail si sa selecteze un comentariu din cele trei propuse. Cīnd apasati butonul Create!, semnatura este prezentata īntr-un MultiLineEdit. La apasarea butonului Cancel, programul se va termina. Notć Acest proiect, constituit ca tutorial, nu reflecta utilizari neaparat practice. Reveniti la fereastra Qt Designer cu noul dialog deschis. Veti remarca ca Property Editor este completat cu date referitoare la noua forma pe care ati creat-o. Pe prima linie este trecut numele formei, adica Form1. Dati clic pe cīmpul ce-i contine numele pentru a-l schimba īn SigCreateDlg. Acesta va constitui numele clasei de dialog asa īncīt ar trebui denumit sugestiv. Proprietatile se modifica īn felul urmator: selectati proprietatea pe care doriti sa o modificati si schimbati-i setarile din dreapta ei. Proprietatea Caption trebuie īnlocuita cu SigCreateDlg v.01. _________________________________________________________________ Editorul de proprietati Editorul de proprietati _________________________________________________________________ Acum vom īncepe sa adaugam widget-uri īn dialogul nostru. Adaugarea de widget-uri Pentru īnceput vom insera textul īn partea de sus a ferestrei program, care arata ca īn imaginea de mai jos. Acest text informeaza utilizatorul despre modul de folosire a programului. Tipul de widget folosit se numeste eticheta si puteti include unul īn program īn felul urmator: * Selectati dialogul astfel īncīt acesta sa fie pozitionat īn bara de unelte: Common Widgets->TextLabel. * Cursorul pozitionat pe forma va lua forma de cruce. Desenati un dreptunghi pentru eticheta, ca īntr-un program de desenat si veti observa ca acesta va fi creat cuprinzīnd un text oarecare. * Pentru a modifica acest text dati dublu clic pe eticheta si apoi tastati textul dorit. Acesta va fi This program will create an email signature for you. Just fill in the boxes and hit the Create! button. Selectati Align Center pentru a-l pozitiona. _____________________________________________________________ Textul din eticheta text Textul din eticheta text _____________________________________________________________ * La final, folosind agatatorile, redimensionati widget-ul la marimea dorita. Pentru a fi pozitionat īn partea de sus a ferestrei centrati eticheta cu ajutorul mouse-ului. Aceasta tehnica este doar una temporara īnsa. Īn capitolele viitoare vom studia alte tehnici de aranjare, mai elegante. _________________________________________________________________ QLabel-ul de sus QLabel-ul de sus _________________________________________________________________ Aceasta procedura este folosita pentru fixarea oricarui tip de widget care poate fi suportat de Qt Designer: selectati-l, mutati-l si apoi modificati-i proprietatile si dimensiunea. Un concept interesant īn Qt Designer este faptul ca widget-urile pot functiona ca si containere pentru alte widget-uri. Acest fapt poate fi demonstrat prin crearea de linii de editare īn interiorul cadrului. Īn imaginea de mai jos avem mai multe etichete si casute text īn interiorul unui cadru, care este denumit GroupBox si functioneaza ca un container pentru etichetele si casutele text din interiorul sau. Īntr-o prima faza vom crea frame-ul selectīnd GroupBox-ul: dialogul Toolbox->Containers sau Tools->Containers->GroupBox din bara de defilare. Puteti crea casutele text trasīnd cu mouse-ul chiar sub eticheta creata anterior. Īn Property Editor puteti modifica proprietatile titlului astfel īncīt sa modificati textul din cadru. Completati cīmpul destinat titlului cu detaliile necesare. Daca observati un "+" īn fata unui item din Property Editor acesta indica faptul ca exista subproprietati ale sale ce pot fi de asemenea modificate. Dupa ce ati creat cadrul (spre exemplu GroupBox-ul), creati īnca trei etichete ca si cea de mai sus, dar de acesta data īn cadrul GroupBox-ului. Puteti verifica apoi īn Object Explorer (Windows->Views->Object Explorer) daca etichetele au devenit descendentii cadrului GroupBox. Modificati textul etichetelor dīnd dublu clic pe ele. _________________________________________________________________ Un GroupBox cu 3 etichete Un GroupBox cu 3 etichete _________________________________________________________________ Dupa ce ati realizat toate acestea puteti crea casutele text. Ele vor permite utilizatorului sa-si introduca numele si adresa de e-mail. Vom folosi cel mai simplu tip de astfel de casute: un widget numit QLineEdit care permite utilizatorului sa introduca un text pe un singur rīnd. Pentru nume si adresa de e-mail trebuie create doua astfel de widget-uri. Īn meniul Tools selectati Input Line Edit si trasati widget-ul līnga eticheta intitulata Your name. Se procedeaza analog si pentru adresa. Comentariul personalizat va fi ales de catre utilizator. Vom folosi o lista derulanta care va pune la dispozitia utilizatorului trei comentarii. Selectati iconita ComboBox sau meniul Tools->Input->ComboBox si pozitionati casuta līnga eticheta Witty comment. Apoi dati dublu clic pe aceasta pentru a introduce textul dorit. Selectati butonul New Item si introduceti textul comentariului īn casuta din dreapta. Repetati operatiunea pentru al doilea si al treilea comentariu. Apasati OK cīnd ati terminat. Redimensionati widget-urile pentru a avea un aspect compact. Denumirea widget-urilor: Pīna īn momentul de fata nu am numit nici unul dintre widget-urile plasate īn program. Este util ca acestora sa li se atribuie o denumire interna pentru a putea fi apelate ulterior īn program. Etichetele, neīndeplinind nici o functie nu trebuiesc denumite, īnsa alte widget-uri necesita acest lucru. Acesta este cazul casutelor text al caror continut trebuie prelucrat. Numele ar trebui sa poata fi recunoscut cu usurinta si sa fie logic. Numele sīnt atribuite cu ajutorul proprietatii omonime (Name) care se gaseste īn partea superioara a Property Editor. Prima LineEdit va fi denumita nameBox, iar cea de-a doua, mailBox. ComboBox-ul va fi identificat ca commBox. Aceasta ne va permite sa accesam comentariile. Dati clic pe fiecare casuta text si completati denumirea sa īn cīmpul Name din Property Editor. Procedati similar si la ComboBox. Proiectarea grafica va fi finalizata prin adaugarea unei etichete intitulate Generated Signature. Sub aceasta vom adauga un TextEdit (Tools->Input->TextEdit) unde va fi generata semnatura. Aceasta va fi denumita sigBox. Adaugam apoi doua butoane īn partea de jos (Create! si Cancel). Acestea nu vor fi neaparat denumite. Salvati forma. O puteti previzuliza astfel: Preview->Preview Form. _________________________________________________________________ Forma īnainte de aranjare Forma īnainte de aranjare _________________________________________________________________ Spatierea widget-urilor Aceasta sectiune descrie managementul layout-ului. Daca redimensionam fereastra de previzualizare veti observa ca widget-urile nu-si modica corespunzator dimensiunile. Pentru a īmbunatati aspectul acestora vom folosi o proprietate a Qt denumita control de spatiere. Acestea sīnt ca niste arcuri virtuale care īmping widget-urile pe fiecare dimensiune īn parte. Notć Un layout bun este esential pentru aplicatia dumneavoastra deoarece este posibil ca atunci cīnd anumite parti ale acesteia sīnt traduse, sa fie mai lungi decīt varianta īn engleza si sa fie totusi necesar ca acestea sa īncapa īn widget-uri. Geometria widget-urilor trebuie sa fie "prietenoasa" pentru cazul īn care redimensionam fereastra aplicatiei. Layout-urile sīnt realizate prin īncercari cu ajutorul operatiunii de previzualizare ce va va permite sa vedeti rezultatele obtinute si sa-l alegeti pe cel optim. Pentru īnceput vom folosi controalele de spatiere pentru a centra textul din casuta de sus. Redimensionati eticheta astfel īncīt sa aiba dimensiunile textului. Apoi adaugati doua astfel de controale de spatiere, unul la fiecare capat, astfel: selectati iconita reprezentīnd un arc sau meniul Layout->Add Spacer. Mutati fiecare control pe orizontala. Pentru ca elementul de spatiere sa reapara este suficient sa dati clic pe spatiul din stīnga textului. Repetati procedura si pentru partea dreapta. Apoi adaugati un astfel de control īn dreapta etichetei Generated Signature si un altul īn stīnga butonului Create!. _________________________________________________________________ Adaugarea spatiatoarelor Adaugarea spatiatoarelor _________________________________________________________________ Acum spatiile libere fiind ocupate de controalele de spatiere, avem nevoie de un management al layout-ului. Acesta va permite widget-urilor sa fie redimensionate de fiecare data cīnd ferestra principala īsi modifica dimensiunile. Este obligatoriu sa avem un bun management al layout-ului. Dupa alegerea acestuia redimensionati de mai multe ori fereastra pentru a va asigura ca totul este īn regula. Putem folosi fie management vertical, fie orizontal, fie grila. Primul rīnd al widget-ului este orizontal (control de spatiere + eticheta + control de spatiere), necesitīnd astfel un management orizontal. Cele trei widget-uri trebuie selectate simultan: selectati-l pe primul si apoi pe al doilea si al trelea tinīnd apasata tasta Shift. Apoi dati clic pe iconita Horizontal Layout (sau meniul Layout->Layout Horizontally). Veti observa o linie rosie ale carei dimensiuni pot fi modificate īn jurul celor trei obiecte pentru a indica ca layout-ul este ajustat. Redimensionati casuta rosie daca este necesar. Acum puteti repeta procedura pentru celelalte trei etichete, de data acesta folosind un management vertical al layout-ului, ca si pentru cele doua LineEdit si pentru ComboBox. Managementul vertical este de preferat pentru alinierea obiectelor. Folosindu-l pe cel orizontal, casutele si etichetele nu vor avea aceeasi dimensiune si nici nu vor fi aliniate. Acest tip de management īnsa este necesar pentru etichetele īnsotite de controale de spatiere cīt si pentru butoanele cu controale. Pentru a termina layout-ul trebuie ca forma sa supervizeze casutele al caror management de layout a fost deja modificat. Astfel, vom plasa totul īntr-o grila. Acest lucru se realizeaza astfel: clic dreapta pe forma si selectati Layout in a grid. Imaginea obtinuta trebuie sa se asemene cu figura de mai jos. _________________________________________________________________ Managementul complet al layout-ului Managementul complet al layout-ului _________________________________________________________________ Semnale si sloturi Semnalele si sloturile sīnt folosite pentru comunicatia dintre obiecte. Mecanismul semnal/slot este o trasatura centrala a Qt si probabil partea care īl diferentiaza cel mai mult de alte programe similare care de regula folosesc functii "callback". Īn Qt un semnal este emis de un widget atunci cīnd apare un eveniment, de obicei acesta fiind declansat de catre utilizator, spre exemplu apasarea unui buton sau scrierea unui text īntr-un QLineEdit. Un slot este o functie care raspunde unui anumit semnal. Acum widget-urile sīnt implementate si layout-ul ajustat. Ultimul lucru ce trebuie facut īn legatura cu design-ul formei este crearea unor conexiuni semnal-slot. Pentru a face acest lucru manual este nevoie de o functie connect(), dar Qt Designer vine īn ajutor cu o solutie simpla, dar eficienta. Pentru a crea aceste conexiuni vom folosi controalele de conectare, fie selectīnd iconita (sub forma de sageata rosie ce patrunde īntr-un patrat verde), fie selectīnd din meniu Tools->Connect Signals/Slots sau apasīnd F3. Pentru a crea o conexiune, dati clic pe forma, pe widget-ul care va fi legat de slot, trageti linia īn afara formei si apoi eliberati butonul mouse-ului. Īn primul rīnd ne vom ocupa de butonul Create!. Selectati Connect Signal/Slot fie cu ajutorul iconitei, fie din meniul Tools sau apasīnd F3. Apoi dati clic pe butonul Create! cu cursorul īn forma de cruce si trageti linia īn afara formei. Cīnd eliberati butonul mouse-ului veti vedea conexiunile ca īn figura. _________________________________________________________________ Crearea unui slot nou Crearea unui slot nou _________________________________________________________________ Acum dorim sa cream un slot care sa genereze o semnatura īn momentul īn care utilizatorul va apasa butonul Create!. Semnalul va fi clicked() (puteti alege din 5 semnale pentru un QPushButton) si trebuie sa cream slotul pentru a realiza apoi conexiunea. Pentru a crea slotul vom da clic pe butonul Edit Slots care va deschide o fereastra ca īn figura de mai jos. Acum dati clic pe New Slot, redenumiti slotul aparut (īn loc de new_slot(), slotCreateSig()), dar pastrati specificatorul de acces. Cīnd veti apasa OK veti reveni la fereastra conexiunilor ce va afisa īnsa un nou slot īn sectiunea Slots. _________________________________________________________________ Vizualizare si editare conexiuni Vizualizare si editare conexiuni _________________________________________________________________ Pentru a realiza o noua conexiune selectati pur si simplu semnalul dorit (care īn acest caz este clicked()) si apoi selectati slotul (slotCreateSig()). Cīnd ati selectat si semnalul si slotul, veti vedea conexiunea realizata īn partea de jos a ecranului. Dupa ce ati finalizat apasati OK. Repetati procedura si pentru butonul Cancel folosind semnalul clicked() si slotul close(). Acum semnalele si sloturile sīnt terminate. Generarea codului sursa Īn acest tutorial vom folosi controlul de subclasare KDevelop din Automake Manager. Daca aveti o versiune KDevelop care nu are aceasta capacitate treceti la Cap. 7, Generarea codului sursa (alta metoda) unde acest pas este explicat fara utilizarea acestui control. Vom porni de la proiectul KDE intitulat SigCreate si sigcreatedlg.ui pe care l-am adaugat la acest proiect. Īn Automake Manager, īn sectiunea sigcreate trebuie sa aveti trei fisiere: sigcreatedlg.ui, sigcreate.cpp si main.cpp. Proiectul trebuie sa poata fi compilat si sa afiseze o fereastra principala ca īn figura din Cap. 3, Crearea aplicatiei. Cum clasa sigcreate nu ne este de folos o vom īndeparta si o vom folosi pentru subclasarea sigcreate.dlg. Īn fereastra Automake Manager, dati clic dreapta pe sigcreate.cpp si selectati Remove. Īn fereastra ce va aparea bifati si Also Remove it from Disk. Procedati similar si cu sigcreate.h. Aceasta este modalitatea de a sterge fisiere care nu va mai sīnt necesare, Makefile.am fiind actualizat. Nu uitati sa rulati automake & friends si sa configurati īnaintea compilarii proiectului. Nu vom proceda astfel deoarece vom face si alte schimbari. Numele de clasa SigCreate va fi acum folosit pentru subclasa. Īn Automake Manager, īn sigcreate, dati clic dreapta pe sigcreatedlg.ui si alegeti Subclass Widget din meniu ce apare. Completati numele subclasei cu SigCreate. Bifati casuta Reformat source si apasati OK. Nu adaugati fisierele īn SVN deoarece aceasta optiune nu a fost activata īn proiectul nostru. Notć Puteti vedea ca slotul pe care l-am creat īn Qt Designer este listat aici si selectat. Metoda va fi implementata īn fisierele generate. Daca īl deselectati, nu va fi generat codul īn clasa dumneavoastra. _________________________________________________________________ Dialogul subclasei Dialogul subclasei _________________________________________________________________ Trebuie sa eliminam cīteva linii din main.cpp deoarece proiectul model de aplicatie simpla KDE face referire la KMainWindow care īn mod normal este clasa de baza utilizata. Dar aici SigCreate este bazat pe QWidget. Trebuie sa stergeti toate liniile dintre KApplication app; si return app.exec(); cu exceptia celor pastrate aici: SigCreate *mainWin = 0; mainWin = new SigCreate(); app.setMainWidget( mainWin ); mainWin->show(); Implementarea slotului Dupa aceea implementati slotul adaugīnd urmatoarele linii īntre acolade: void sigcreate2::slotCreateSig() {} pentru a implementa slotul: sigBox->append("\n--"); sigBox->append(nameBox->text()); sigBox->append(mailBox->text()); sigBox->append(commBox->currentText()); si bineīnteles antetele corespunzatoare: #include #include #include Executati Build->Run automake & friends, Build->Run configure, Build->Build Project, Build->Install (sau Build->Install ca utilizatorul root), Build->Execute Program. Asta-i tot! Programul functioneaza! Vedeti imaginea de mai jos. _________________________________________________________________ Programul Programul _________________________________________________________________ Cīteva cuvinte īn plus despre semnale si sloturi. Mecanismul de semnale si sloturi este "type safe": semnatura unui semnal trebuie sa se potriveasca cu semnatura slotului ce īl receptioneaza (de exemplu, veti conecta valueChanged(int) cu un slot avīnd ca argument un int). Un alt lucru de tinut minte este ca toate clasele care mostenesc QObject sau una din subclasele sale (de exemplu QWidget) pot contine semnale si sloturi. Toate textele pe care le folositi īn programul dumneavoastra KDE trebuie sa fie īncapsulate īn functia i18n() function (care are ca antet klocale.h) deoarece toate proiectele KDE sīnt traduse īn alte limbi. Cititi Cum sa traducem KDE pentru a afla mai multe despre internationalizare si Cap. 5, Internationalizarea unui proiect KDE simplu al acestui tutorial pentru a afla cum sa traduceti aplicatia. Daca vreti sa fiti ajutat, puteti sa-mi trimiteti un e-mail sau sa discutam pe IRC (serverul irc.openprojects.net, pe canalul #kde-women sau #kde-devel, iar porecla mea este annma). Puteti descarca codul sursa al proiectului SigCreate project daca dati clic pe sigcreate-0.1.tar.gz. Tineti cont ca pentru a-l compila aveti nevoie de Qt-3.2.0 sau mai recent. Cap. 4. Pe scurt Acesta este un rezumat despre cum sa lucrati cu KDevelop si Qt Designer. * Din meniul KDevelop File->New, selectati un fisier Widget (.ui) si dati-i un nume (de exemplu kprojectdlg), selectati add to Project. Dati clic pe OK. * Va porni Qt Designer. Lucrati pe forma iar apoi salvati fisierul si īnchideti Qt Designer. Fisierul va apare īn KDevelop īn sectiunea User Interface (kprojectdlg.ui). * Creati o clasa noua (de exemplu cu numele KProject) (Project menu, iar apoi New class...) care mosteneste clasa din fisierul dialog creat (kprojectdlg) si este o clasa fiu QWidget. * Adaugati sloturile si alte semnale sau functii membru īn clasa derivata KProject. Cap. 5. Internationalizarea unui proiect KDE simplu Cuprins Instalati o versiune de gettext modificat pentru KDE Pregatiti traducerile Traduceti mesajele Compilati si instalati cataloagele de mesaje Referinta Cīnd proiectul este terminat, ati putea dori ca interfata grafica sa fie tradusa īntr-una sau mai multe limbi. Aici aflati cum sa faceti acest lucru. Instalati o versiune de gettext modificat pentru KDE Instalati o versiune modificata de gettext de la http://developer.kde.org si puneti-l īn directorul dumneavoastra personal. Aceasta versiune o gasiti la http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/ $ tar xvzf gettext-0.10.35-kde.tar.gz $ cd gettext-0.10.35-kde $ ./configure $ make $ mkdir -p ~/bin $ cp src/gettext src/xgettext ~/bin # copiati gettext si xgettext # īn directorul $HOME/bin $ export PATH=~/bin:$PATH Pregatiti traducerile Apoi treceti īn directorul proiectului: $ cd /calea/la/proiectulmeu Setati variabila de mediu KDEDIR sa indice la instalarea dumneavoastra de KDE ? pe sistemul meu Mandrake Linux este /usr. Aceasta calea poate fi determinata si executīnd kde-config --prefix. $ export KDEDIR=`kde-config --prefix` # sau export KDEDIR=/usr Creati fisierele de traduceri PO (cataloagele de mesaje): $ make -f admin/Makefile.common package-messages Traduceti mesajele Traduceti fisierele .po cu ajutorul KBabel. Aceste fisiere sīnt īn directorul po al proiectului dumneavoastra. Avertisment Nu va atingeti de fisierul .pot! Compilati si instalati cataloagele de mesaje $ make package-messages $ sudo make install Referinta Cititi aici versiunea originala a acestui capitol scris de Thomas Nagy. Cap. 6. Cīteva sfaturi generale Cuprins Sfaturi generale Numele aplicatiei dumneavoastra Stil de programare Importarea proiectului dumneavoastra īn SVN-ul KDE Cum sa distribui codul sursa ca pachet arhiva? Resurse utile Sfaturi generale Numele aplicatiei dumneavoastra Numele aplicatiilor KDE īncepe, īn general, cu litera K urmata de un nume ce sugereaza ce face programul. De exemplu, KMail este foarte simplu si sugereaza utilizatorului ca īntr-adevar aceasta este o aplicatie KDE si se ocupa de e-mail-uri. Pentru numele care urmeaza literei K este util sa alegeti un nume īn limba engleza. Bineīnteles ca aceasta este numai o indicatie. Sīnteti liber sa alegeti ce doriti, dar un nume bun face ca aplicatia dumneavoastra sa fie cunoscuta mult mai rapid. Notć Cautati pe Google (īn Konqueror, scrieti gg:numele_aplicatie_dumneavoastra) pentru a vedea daca numele aplicatiei este deja folosit sau este protejat de drepturile de autor. Daca este asa sau aveti dubii, schimbati-l. Stil de programare Comentariile trebuie sa fie īn engleza deoarece este mult mai usor pentru cineva care va citeste codul sursa. Numele claselor sīnt īn mod normal īn engleza si trebuie sa indice ce face clasa. Exemple bune: TopLevel, CursorInterface, TaskManager. Observati literele majuscule si tineti cont ca C++ este senzitiv la majuscule. Numele functiilor īncep cu litera mica. Iata cīteva exemple: void activateRaiseOrIconify(); void toDesktop(int); void windowAdded(WId); Indentarea codului poate fi oricum doriti atīta timp cīt este usor de urmarit si de alti programatori. Īntotdeauna tineti cont ca altii īl vor citi si eventual vor īncerca sa-l faca mai usor de īnteles. Importarea proiectului dumneavoastra īn SVN-ul KDE Programul dumneavoastra este interesant, credeti ca aveti timp sa lucrati serios la el, aveti nevoie de pareri si ajutor pentru a-l īmbunatati. Sīnteti de acord sa-l distribuiti sub licenta GPL sau echivalenta. Puteti cere un cont SVN pentru a-l importa īn kdenonbeta. Modulul kdenonbeta este destul de maire si nu este distribuit cu KDE-ul oficial. Nu este distribuit ca pachet, nici tradus si ciclurile uzuale de dezvoltare-distribuire. Scopul sau este sa permita celorlalti dezvoltatori sa lucreze la aplicatia dumneavoastra si sa o testeze. Bineīnteles ca aveti nevoie cel putin de qt-copy, arts si kdelibs din SVN trunk. Ca sa aflati cum sa lucrati cu SVN, cititi Using Subversion with KDE. Notć Cīnd aplicatia are finalizate cele mai importante functii, este total compatibila KDE (i18n, xml GUI, etc.), puteti īntreba daca poate fi mutata īntr-un pachet KDE oficial. Pentru a obtine un cont SVN, urmati aceste instructiuni. Trimiteti un e-mail la sysadmin (at) kde (dot) org īn care justificati de ce aveti nevoie de el. Spuneti ca doriti sa importati aplicatia (numele_aplicatiei) īn modulul kdenonbeta. Asigurati-va ca v-ati dat numele complet si adresa de e-mail daca sīnt diferite de cele din cīmpul "From" al mesajului. Puteti sa cereti un anumit nume pentru cont. La ora actuala accesul la SVN poate fi realizat prin SVN-peste-SSH sau HTTPS. Pentru acces svn+ssh aveti de ales īntre autentificare cu parola sau cu pereche de chei publica-privata. La e-mail atasati cheia publica dorita (de exemplu: ~/.ssh/id_dsa.pub). Asteptati un raspuns din partea administratorilor de sistem KDE. Dupa ce ati compilat cel putin qt-copy, arts si kdelibs, trebui sa obtineti o copie de lucru a fisierelor din kdenonbeta. Autentificati-va la serverul SVN cu numele de utilizator si parola obtinute mai devreme. $ svn co protocol://username@svn.kde.org/home/kde/trunk/KDE/kdenonbeta $ cd kdenonbeta $ svn co protocol://username@svn.kde.org/home/kde/trunk/KDE/kde-common/admin Copiati cu totul directorul principal al proiectului īn kdenonbeta si apoi, din directorul principal, executati: $ make distclean Toate fisierele .o trebuie sa fi disparut. Stergeti manual toate fisierele Makefile, Makefile.in (dar nu si Makefile.am) si toate cele generate de KDevelop. Stergeti directoarele admin, autom4te.cache, debug, doc, po si templates. Trebuie sa mai pastrati numai unele fisiere si subdirectorul src. Mergeti mai sus un director īn kdenonbeta si executati: $ make -f Makefile.cvs $ ./configure --prefix=$KDEDIR $ cd nume_proiect $ make $ su -c 'make install' Toti acesti pasi trebuie sa se execute cu succes. Daca apar erori ar trebui sa le puteti corecta uitīndu-va cu atentie la mesajele de eroare. Daca v-ati blocat si nu mai aveti idei, conectati-va pe IRC si īntrebati pe unul din canalele #kde sau #kde-devel. Cineva va va ajuta. Apoi īn directorul kdenonbeta executati: $ svn add nume_proiect $ svn add nume_proiect/* $ svn add nume_proiect/src $ svn add nume_proiect/src/* $ svn commit Va apare o fereastra (implicit cea a editorului vi) unde introduceti un mesaj jurnal. Este o practica buna sa scrieti observatii la ceea ce puneti sau adaugati īn SVN. Īn cazul dumneavoastra veti spune (mai īntīī apasati i pentru a intra īn modul de editare al vi): Prima importare a proiectului nume_proiect. Verificati ca toate fisierele au fost corect adaugate. Daca nu, folositi comenziile svn add filename si svn commit. De fiecare data cīnd doriti sa lucrati la proiect, nu uitati sa rulati: $ svn up ca sa fiti sigur ca aveti ultima versiune. Cum sa distribui codul sursa ca pachet arhiva? Trebuie sa aveti instalat pe sistemul dumneavoastra modulul kdesdk. Īn acest modul exista kdesdk/scripts/svn2dist, un script care extrage o aplicatie din arborele cu cod sursa KDE si īl īmpacheteaza ca pe o aplicatie de sine statatoare. Daca rulati comanda svn2dist --help, obtineti: Usage: svn2dist module directory [options] [addfile1] [addfile2] ... Considerīnd ca aplicatia dumneavoastra este īn modulul kdenonbeta si are numele KMyApp, iata comanda pe care trebuie sa o executati: $ svn2dist /calea/la/sursele/svn/kde/kdenonbeta/ kmyapp -n kmyapp -v 0.1 unde īnlocuiti kmyapp cu numele aplicatiei dumneavoastra si 0.1 cu versiunea curenta a programului. Īn directorul unde ati executat comanda vor fi create doua pachete: kmyapp-0.1.tar.gz si kmyapp-0.1.tar.bz2. Resurse utile * Raspunsuri la īntrebari frecvente pentru programatorul KDE + http://developer.kde.org/documentation/other/developer-faq.ht ml * KDE Application Developer's Checklist + http://developer.kde.org/documentation/other/checklist.html * Tutorial interfata grafica XML KDE + http://www.ro.kde.org/articole/xmlgui.html * Referinta API-ului KDE (pentru SVN trunk) + http://developer.kde.org/documentation/library/cvs-api/ * Proiectarea interfetelor grafice KDE + http://developer.kde.org/documentation/standards/kde/style/ba sics/index.html * Referinta Qt pe web + http://doc.trolltech.com/3.2/index.html * Qt Quartely: stiri pentru programatorii C++ si Qt + http://doc.trolltech.com/qq/ * The C++ FAQ Lite + http://www.parashift.com/c++-faq-lite/index.html * Programarea setarilor utilizator īn KDE 3 + http://www.ro.kde.org/articole/kdeset.html Cap. 7. Generarea codului sursa (alta metoda) Cuprins Fara a folosi functionalitatea de subclasare din KDevelop Implementarea slotului Fara a folosi functionalitatea de subclasare din KDevelop Pasul 1 - Verificati ca ati salvat forma cu numele sigcreatedlg.ui si īnchideti Qt Designer. Daca deschideti acest fisier cu un editor de text, veti vedea ca nu este cod sursa C++, ci cod de marcare XML. Cu Qt Designer vine si un utilitar de linie de comanda special numit uic. Aceasta comanda este folosita pentru a converti fisierul .ui īn fisiere .h si .cpp. Īn mod normal aceasta operatie este facuta automat de KDevelop. Notć Daca dintr-un anumit motiv KDevelop nu genereaza fisierele .h si .cpp din sigcreatedlg.ui, iata mai jos doua comenzi pe care le puteti executa manual īntr-o consola, īn directorul sigcreate/src: uic -o sigcreatedlg.h sigcreatedlg.ui uic -o sigcreatedlg.cpp -i sigcreatedlg.h sigcreatedlg.ui Pasul 2 - Acum trebuie sa derivati clasa pe care KDevelop a generat-o pentru dumneavoastra (clasa SigCreate) din noua clasa dialog Qt Designer. Īn KDevelop afisati fisierul sigcreate.h selectīndu-l īn File Selector si adaugati #include "sigcreatedlg.h" īn partea de sus a fisierului sigcreate.h, cu toate antetele de care aveti nevoie. #include #include #include #include #include #include /** SigCreate este clasa de baza a proiectului */ class SigCreate : public SigCreateDlg { Īnlocuiti public KMainWindow cu public SigCreateDlg deoarece SigCreate se trage din SigCreateDlg. Īn fisierul sigcreate.h ar trebui sa aveti urmatoarele linii: class SigCreate : public SigCreateDlg { Q_OBJECT public: /** constructor */ SigCreate(QWidget *parent=0, const char *name=0); /** destructor */ ~SigCreate(); }; Fisierul sigcreate.cpp ar trebui sa arate ca mai jos: #include "sigcreate.h" SigCreate::SigCreate(QWidget *parent, const char *name) : SigCreateDlg(parent, name) { } SigCreate::~SigCreate() { } Pasul 3 - De asemenea trebuie sa adaugati manual fisierele incluse. Īn sigcreate.h adaugati antetele urmatoare, cīte unul pentru fiecare din clasele pe care le-am folosit: #include #include #include Pasul 4 - Comentati cīteva linii din fisierul main.cpp: /* if (app.isRestored()) { RESTORE(SigCreate); } else*/ deoarece proiectul era initial generat sa se bazeze pe KMainWindow ce ofera foarte multe functionalitati. Notć Deoarece acest program este gīndit pentru un tutorial, nu reflecta un flux de programare "real". Dupa ce ati inclus fisierul .ui, creati o clasa noua, SigCreate. Pentru a face acest lucru dati clic dreapta pe Classes, selectati New Class... si apoi va aparea dialogul Class Generator. Introduceti numele clasei (SigCreate) si al clasei de baza (SigCreateDlg). Nu uitati sa selectati optiunea generate a QWidget-childclass. La sfīrsit dati clic pe OK. Nu am parcurs acel pas deoarece clasa SigCreate este fereastra noastra principala. Avertisment Clasa derivata nu poate fi numita ca fisierul .ui. Din fisierul .ui sīnt generate automat fisierele .h si .cpp asa ca trebuie sa aiba nume diferite. Puteti sa evidentiati un fisier de interfata grafica adaugīnd dlg la numele lui. Clasa derivata din .ui s-ar putea numi de exemplu mainWindowDlg. Acum generati proiectul pentru a vedea daca totul este corect. Mai īntīi rulati Build->Run automake & friends, Build->Run configure, Build->Build Project si Build->Install (sau Install ca utilizatorul root). La final porniti programul cu Build->Execute Program (sau Shift+F9). Retineti ca īn functie de configuratia dumneavoastra, daca nu aveti acces de scriere īn $KDEDIR, s-ar putea sa fie nevoie sa executati Build->Install ca utilizatorul root. De asemenea puteti sa sariti peste pasul cu instalarea. Pentru tutorialul de fata nu este o problema, dar la aplicatiile reale s-ar putea sa apara probleme. Interfata grafica trebuie sa apara dar pentru moment butonul Create! nu merge. Īl vom rezolva implementīnd slotul slotCreateSig(). Vedeti imaginea de mai jos. Daca la compilare va loviti de eroarea Syntax error before `{' token facīnd referire la acolada dreapta īnainte de linia cu Q_OBJECT din sigcreate.h, atunci ati uitat sa adaugati #include "sigcreatedlg.h" sau fisierul sigcreatedlg.h nu a fost creat (conform notei de mai sus). _________________________________________________________________ Programul Programul aproape gata _________________________________________________________________ Implementarea slotului Pentru a face programul sa functioneze dorim sa dam clic pe butonul Create! si acest lucru afiseaza semnatura īn cīmpul TextEdit. Este important sa īnvatati din documentatia Qt ce face fiecare widget, sa aflati semnalele si sloturile asociate. De exemplu cititi documentatia clasei QPushButton. Ea este derivata din QButton si īn documentatia QButton puteti vedea usor care sīnt semnalele disponibile. Signals void pressed () void released () void clicked () void toggled ( bool on ) void stateChanged ( int state ) Deci semnalul de care avem nevoie aici este clicked() emis de butonul Create!. Deoarece SigCreate este o clasa derivata din SigCreateDlg, slotul nostru īl implementam īn clasa SigCreate. El va fi o metoda publica. Īn fisierul sigcreate.cpp adaugam urmatoarele linii: void SigCreate::slotCreateSig() { sigBox->append("\n--"); sigBox->append(nameBox->text()); sigBox->append(mailBox->text()); sigBox->append(commBox->currentText()); } si bineīnteles declaram acea metoda īn fisierul sigcreate.h, dupa cum urmeaza: public slots: virtual void slotCreateSig(); Īn codul de mai sus puteti vedea ca īn sigBox, care este un TextEdit, va fi un "--", apoi textul din nameBox (numele pe care l-ati introdus), adresa de e-mail plus comentariul. append() este o metoda QTextEdit. Aceasta clasa are o multime de functii membru astfel ca ar trebui sa cititi documentatia ei ca sa aflati ce metoda va trebuie si functionalitatile widget-ului īn general. Generati din nou proiectul (Build->Build Project sau Build->Install ca utilizatorul root) si rulati programul. Iata mai jos ce ar trebui sa obtineti: _________________________________________________________________ Merge! Merge! _________________________________________________________________ Cap. 8. Multumiri si licenta Tutorial copyright 2001-2003 Anne-Marie Mahfouf Contributori: * Cap. 5, Internationalizarea unui proiect KDE simplu: Thomas Nagy Aceast? documenta?ie este licen?iat? sub termenii Licen?ei Documenta?iei Libere GNU (GNU Free Documentation License).