Nå har jeg gjennomført et mindre prosjekt som faktisk gjør noe nyttig, for å prøve å sette meg litt inn i dette(som jeg nevnte i forrige artikkel om qt). I denne applikasjonen så har jeg brukt Qt-Creator/C++ til å lage en klient som skal koble seg til itree-serveren vha TCP/socket tilkopling. Har som sagt tidligere, laget en C-versjon(kjøres i bakgrunnen) og en PHP-versjon(som også har en del fine funksjoner for strukturering av dataen). I denne versjonen(C++ vha Qt), så er det ikke noe nytt. Grafisk grensesnitt er vel det eneste nye. Så langt iallefall. Man kan også velge hvilket tre man vil kople seg på. Her er iallefall et skjermbilde:

Det ser ikke så flott ut men det fungerer. Dataen er litt rotete, så jeg kunne sikkert ha funnet på en annen måte å vise dem fram på. Men...det er ikke det jeg skal snakke om...

Signals and slots har jeg litt lyst til å si et par ord om. Har funnet ut at det går an å legge til egen-definerte signaler og slotter i Qt-Creator. Det så jeg ikke i Qt-Designer. Dette var mye enklere enn det jeg trodde:

Først av alt: Man må åpne en "form", for å kunne editere signals/slots: Her er et skjembilde av hvordan mine signaler er konfigurert:

Og her ser dere at jeg har lagt til 3 slots: Ved forandring, ved klikk osv...men det er ikke dette som er interessant. Det er hvordan man skal få til dette. Når man lager en ny kopling kommer følgende dialog-boks opp:


Trykker man på knappen "Edit" så får man sjansen til å lage/skrive inn egen-definerte slots. Man kommer da fram til følgende dialog:

Man trykker på "+"-tegnet og man kan skrive opp et navn som "slotten" skal hete. Som bildet ovenfor viser, så har jeg laget 3 slotter/funksjoner for å håndtere når en viss handling inntreffer. Disse funksjonsnavnene legger man til i klassen som skal håndtere situasjonen. Som nedenfor så er det hovedklassen min:

.Veldig enkelt og greit. Med tanke på de problemene jeg hadde når jeg brukte bare Qt-Designer så er dette ganske enkelt. Og det jeg skrev blir på en måte "deprecated". Kan iallefall anbefale å bruke Qt-Creator. Den har "alt". Alt fungerer veldig bra. Debuggeren, designeren og kode-editoren. "Flawless" er nesten et ord jeg ville bruke. Det eneste som trekker hele sullamaditten ned er at man må åpne prosjekt-fila i en annen editor for å legge til andre bibliotek/libraries. Det tok ei stund før jeg fant ut av det. Men når det er gjort så fungerer alt glimrende. Bare så det er sagt. Jeg har brukt Qt-Creator 2.6.2 basert på Qt-4.8.4 (64 bit).

Det som var litt interessant med å teste Qt var å finne ut om det var enkelt å skjønne/finne løsninger, og en konklusjon jeg tok ganske tidlig var at "neste gang jeg skal lage et Qt-prosjekt så skal jeg holde meg til Qt sine datatyper". Jeg ble litt overivrig og tenkte at jeg skulle lage en rot-klasse som brukte bare std som namespace. Uansett, her brukte jeg klassen "string", og litt char*...ja...det ble en fin liten blanding, og mitt under alt dette så la jeg til en QTcpSocket - variabel. Konklusjonen til slutt er vel det at jeg kunne likså-greit ha stappet allt inn i en klasse. Men tanken er slik: rot-klassen ccIClient tar seg av kommunikasjonen med serveren, mens qtItreeClient tar seg av det grafiske. Men i og med at ccIClient allerede bruker Qt til å koble seg på serveren så kunne jeg likså-greit ha holdt meg til Qt sine datatyper. Spesiellt når det gjelder strenger. Dvs bruke QString-klassen istedenfor std::string-klassen...det er bare et eksempel. Da hadde koden forenklet seg litt og blitt litt mer effektiv. Men greit nok...det er første gangen på lenge så..

Det er mye positivt å se om både Qt og Qt-Creator. Følte at det gikk forholdsvis greit å få til det jeg ville. Søkte meg fram til eksempler på det meste. Å begynne å gå i detalj i hver eneste klasse er nesten en umulighet hvis man skal "komme noen steds". Dokumentasjonen er der i haugevis, og klassene er digre, samt  at mulighetene er store. Da er det bare snakk om tid/erfaring som kan hjelpe en med detaljene rundt det hele.

Men det var en ting som jeg trodde var veldig vanskelig: TcpSockets tilkoplinger. Jeg fikk det ikke lett heller, da C-versjonen fungerte helt greit(av en eller annen greunn) og jeg trodde jeg måtte legge til flere konfigureringer for å kunne kople meg til en Linux-socket. Men neida...php-versjonen fungerte faktisk ikke heller....så da fant jeg ut at for første gang på hundre år så skal jeg åpne kildekoden til serveren også(har brukt samme 'build'-versjon for alle oppdateringer av linux/opensuse. Men men..problemet lå i et buffer som mottok headeren som består av 7 bytes som beskriver litt om dataen som skal komme. Størrelsen i server-koden var iallefall satt til sizeof(_idata) som var en struktur som holdt på informasjon om dataen som skulle sendes. sizeof(_idata) husker jeg ikke hvor stor var men det er mer enn 7 bytes. Det er jeg overbevist om. Jeg forandret den størrelsen til 7(nøyaktig) og så begynnte QTcpsocket å fungere. Det eneste  jeg ble nødt til å legge til i forhold til andre skript/språk var waitForBytesWritten og waitForBytesRead. Samt at read og write funksjonene bruker ikke file-descriptors, men klassen inneholder vel en eller annen deskriptor for å kople seg til riktig strøm. Litt merkelig spør du meg men greit nok. Bare det fungerer, samt at det er nytt for meg.

Tror iallefall jeg har sagt nok om dette temaet: Signals and slots in Qt....