C++ User Interface

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

C++ User Interface

Post by curiosul » 02 Aug 2013, 18:21

As vrea sa ma lamuresc cu niste "chiestii" din C++ ca de pe google doar partial am iesit din ceata. As vrea sa trec de la aplicatii consola la aplicatii de tip UI.

Intrebarea mea este cum pot scrie o aplicatie UI in cod C++ pur? Adica am vazut in Codeblock wxWidgets, GTK+, Qt si altele care ma ajuta sa fac chestia asta, dar eu ma gandeam la un cod pur c++ care sa poate fi rulat atat pe Windows cat si pe Linux de exemplu (daca este posibil asa ceva), un cod care sa nu mai depinda de sistemul de operare (gen VC++ - .Net).

PS: Am vazut ca wsWidgets si celelalte au suport si pe alte sisteme de operarea, dar alea sunt c++ pur nativ?


Cea mai buna batalie este cea castigata fara lupta.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: C++ User Interface

Post by Marius Bancila » 02 Aug 2013, 23:48

Standardul C++ nu ofera in biblioteoteca STL suport pentru interfete grafice. Pentru asta trebuie sa folosesti frameworkuri ca cele enumerate mai sus. Qt merge pe toate platformele, cred ca ar putea fi o optiune potrivita pentru ce doresti.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: C++ User Interface

Post by Ovidiu Cucu » 03 Aug 2013, 14:05

Ce inseamna "cod C++ pur"?
Sa inteleg oare ca wxWidgets, GTK+, Qt si altele care ne ajuta sa facem chestii, contin cod C++ impur? :)

George92
Junior
Junior
Posts: 16
Joined: 13 Apr 2013, 00:37
Judet: Dolj

Re: C++ User Interface

Post by George92 » 03 Aug 2013, 18:57

Dupa mine Qt e cea mai buna optiune , are o documentatie super buna si este si cross-platform asa cum doresti

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: C++ User Interface

Post by Ovidiu Cucu » 03 Aug 2013, 23:05

George92 wrote:Dupa mine Qt e cea mai buna optiune , are o documentatie super buna si este si cross-platform asa cum doresti
Corect, insa ramane intrebarea initiala: "cum pot scrie o aplicatie UI in cod C++ pur?"

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: C++ User Interface

Post by neagu_laurentiu » 04 Aug 2013, 08:09

curiosul wrote:un cod care sa nu mai depinda de sistemul de operare (gen VC++ - .Net)
Doua intrebari :)

George92
Junior
Junior
Posts: 16
Joined: 13 Apr 2013, 00:37
Judet: Dolj

Re: C++ User Interface

Post by George92 » 10 Aug 2013, 14:18

Cred ca ce vroia el sa zica, este faptul ca vrea sa realizeze din cod interfata si nu prin intermediul unor tooluri cu drag & drop si cod generat automat ( gen Qt Designer ).

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: C++ User Interface

Post by Ovidiu Cucu » 10 Aug 2013, 16:17

Posibil, insa eu cred mai degraba ca prin "C++ pur", curiosul s-a gandit la acele programele in consola cu oaresce declaratii, expresii, if-uri si bucle, plus un varf de cutit de cin si cout, asa cum se fac la scoala.
Aparent independente de librarii (pardon, sa le zicem "biblioteci", ca sa nu se supere programmerii filologi :)).

Numai ca, odata ce am pus un varf de cutit de cin/cout, hopaa... deja am folosit o biblioteca: STL (Standard Template Library). Si cu asta n-am impurificat cu nimic C++ul, din moment ce STL vinde la pachet cu standardul de C++.
Altceva impuritati? Unde, in MFC, Qt si altele asemenea? Nu prea, sunt si ele scrise in "C++ pur". Ca folosim oarece clase si functii de acolo nu inseamna ca ne murdarim pe maini.
Clasele si functiile fac si ele parte din limbajul C++ (pur).
E mai clar acum de ce am intrebat?

@neagu_laurentiu: good catch! Intradevar, .NET-ul n-are treaba cu C++ul (pur). Contine acel C++/CLI care e C++ doar cu numele. ;)
@George92 & Marius Bancila: eu unul n-as recomanda nimanui sa sara de la consola direct la Qt sau alte strutzocamile "cross-platform".
@curiosul: VC++ (Visual C++) nu este un limbaj de programare ci un IDE (Integrated Development Environment).

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: C++ User Interface

Post by cristianamarie » 10 Aug 2013, 16:42

curiosul wrote:As vrea sa ma lamuresc cu niste "chiestii" din C++ ca de pe google doar partial am iesit din ceata. As vrea sa trec de la aplicatii consola la aplicatii de tip UI.

Intrebarea mea este cum pot scrie o aplicatie UI in cod C++ pur? Adica am vazut in Codeblock wxWidgets, GTK+, Qt si altele care ma ajuta sa fac chestia asta, dar eu ma gandeam la un cod pur c++ care sa poate fi rulat atat pe Windows cat si pe Linux de exemplu (daca este posibil asa ceva), un cod care sa nu mai depinda de sistemul de operare (gen VC++ - .Net).

PS: Am vazut ca wsWidgets si celelalte au suport si pe alte sisteme de operarea, dar alea sunt c++ pur nativ?
Nu exista asa ceva. UI-ul trebuie sa implementeze o paradigma a sistemului de operare, care e doar C. Ca exista treburi gen wxWidgets, Qt etc. care implementeaza in C++ ferestre, bucle de mesaj etc., clar ca s-au tot (re)inventat.
Nu stiu ce inseamna pentru tine cod C++ pur - daca vrei doar ce e in standardul C++, ghinion. Nici macar compilarea/linkarea nu sint standard nici ele, si de abia in C++ 11 au aparut ceva chestii care ar implementa treburi OS (gen threads).

Ce pot sa iti spun eu e urmatorul lucru: forget it.
Ca sa iti dau cel mai simplu exemplu: daca ai o fereastra in Windows, aia se distruge cind vrea Windows, nu cind vrei tu. Tu primesti un WM_(NC)DESTROY si acolo chemi tu destructorul obiectului tau mapat pe obiectul de la OS (HWND in cazul nostru) - obiect pe care l-ai pasat in WM_(NC)CREATE si l-ai legat cumva de acelasi HWND.

So:
a) C++

Code: Select all

X* pX = new X;
pX->muttleyDoYourJobIWillGiveYouAMedal();
delete pX;
b) GUI (Windows)

Code: Select all

hwnd = CreateWindowExW(......, reinterpret_cast<LPVOID>(this)); // this = obiectul nostrul

static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
  if(msg == WM_NCCREATE) {
    X* pX = reinterpret_cast<X*>( ((LPCREATESTRUCTW)lp)->lpCreateParams) );
    pX->m_hwnd = hwnd;                                                         // set m_hwnd of pX ("bind hwnd to pX")
    ::SetPropW(hwnd, L"this", reinterpret_cast<HANDLE>(pX)); // bind pX to hwnd
  }
  else if(msg == WM_NCDESTROY) {
    X* pX = reinterpret_cast<X*>(::RemovePropW(hwnd, L"this"));
    delete pX;
  }
...
  return DefWindowProcW(hwnd, msg, wp, lp);
}
So, C++-ul aici e mai mult asa, un soi de mapping intre HANDLE-urile de la OS si obiectele noastre C++, care NU se distrug cind vrem noi, nu chemam metodele cind vrem noi ci cind vrea OS-ul etc.
Practic... welcome to event-based programming - lucru pe care in C++ nu o sa il gasesti decit in forma unor templates care fac wrap peste uriciuni ca cea de mai sus.

Toate treburile astea (Qt si restul) asta fac in 90% din timp (UI-related, zic, pentru ca mai sint enorm de multe alte chestii in librariile astea in afara de UI): manajeaza lifetime-ul unor obiecte C++ care grupeaza functionalitati. Make no mistake - HANDLE e cel care dicteaza aici, nu this...

Personal, cind vine vorba de UI (sau OS programming in general), C++ nu (mi-)e decit de un singur folos: RAII. Ca sa nu faci scolioza de la atitea if-uri si acolade, e mai convenient sa scrii nistre wrappere in functii care au de-a face cu multe resurse (file, sockets etc.) care mai trebuie si inchise, buffere dealocate, pointeri COM de facut Release etc. si sa lasi destructorii sa faca treaba corect. Si aici sint pitfalls, ca daca s-a chemat intii CoUninitialize si apoi pComObject->Release() you're fucked.

Pure C++? Nu prea cred. Welcome to the LPVOID world :)
Nuclear launch detected

User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Re: C++ User Interface

Post by curiosul » 11 Aug 2013, 22:33

In primul rand multumesc pentru raspunsuri, evident.

Deci ceea ce intelegeam eu prin C++ pur este ceva de genul, un simplu exemplu pentru lucru cu fisiere:

Vreau sa fac o simpla interfata. Decat sa folosesc

Code: Select all

QFile inputFile("test.txt");
    if (inputFile.open(QIODevice::ReadOnly))
    {
       QTextStream in(&inputFile);
       while ( !in.atEnd() )
       {
          QString line = in.readLine();
          ...
       }
    }

inputFile.close();
pentru deschiderea si citirea dintr-un fisier nu mai bine as folosi:

Code: Select all

ifstream file("test.txt");
    while(file.good())
    {
        getline(myfile, line);
        if (line!="")
            track++;
    }
    return track;
Adica mi se pare mult mai util cel de-al doilea cod deoarece mi se pare strict specific C++-ului si nu Qt-ului. Pe de alta parte daca vreodata renunt la Qt a doua functie o pot folosi si in wxWidgets de exemplu si oriunde se cere C++.
Ca sa fiu mai clar ziceam C++ pur in sensul ca in spatele unui buton dintr-o interfata sa stea un cod C++ ca si cel "din spatele consolei" doar ca spre exemplu in loc de printf convertim rezultatul si il afisam sub forma de MessageBox sau intr-un obiect spre exemplu...

@George92: Da, cam pe acolo m-am referit.
@Ovidiu Cucu: De ce nu recomanzi totusi trecerea la Qt?

PS: M-am apucat de qt...
Cea mai buna batalie este cea castigata fara lupta.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: C++ User Interface

Post by neagu_laurentiu » 12 Aug 2013, 07:26

curiosul wrote:Adica mi se pare mult mai util cel de-al doilea cod deoarece mi se pare strict specific C++-ului si nu Qt-ului.
Utilul e una iar ca "ti se pare" e alta !
Ambele sunt biblioteci iar functionalitatile exportate sunt dependente pana la urma de sistemul de operare (ca unele sunt scrise sa ruleze pe mai multe platforme e alta chestiune).
Daca tu vrei o biblioteca din standardul C++ pentru GUI atunci, dupa cum ti s-a mai spus, nu exista pentru 1001 motive.
curiosul wrote: ziceam C++ pur in sensul ca in spatele unui buton dintr-o interfata sa stea un cod C++ ca si cel "din spatele consolei"
Folosesti o sintagma improprie domeniului in care vrei sa activezi. Limbajul are doar o mana de cuvinte cheie iar restul functiilor/bibliotecilor/claselor/framework-urilor/API-urilor sunt de acelasi rang (produse de diferiti dezvoltatori) iar impreuna formeaza instrumentul de lucru necesar.
curiosul wrote:Da, cam pe acolo m-am referit.
Si acolo unde ai designere si generatoare de cod nu inseamna ca nu vei scrie si tu manual ! Ba din contra.
curiosul wrote:De ce nu recomanzi totusi trecerea la Qt?
Asa cum tu folosesti sintagma (eronat) "C++ pur" dar te gandesti la STL cam tot asa (insa nu eronat) putem vorbi despre "aplicatiile Windows" ca fiind cele construite cu ajutorul tehnologiilor puse la dispozitie de Microsoft, in cazul de fata WinAPI.
QT abstractizeaza ceea ce inseamna o astfel de aplicatie din perspectiva sistemului de operare si a API-ului pus la dispozitie programatorului. In spatele claselor QT, la implementarea sub Windows, stau aceste functii, principii, metodologii din WinAPI numai ca sunt exportate intr-un format arbitrar si folosite pe mai multe platforme (spre ex. QT emuleaza interfata Windows ori GTK ori altceva si nu e una nativa pe cand wxWidgets face apel la functiile OS-ului in materie de GUI si obtine fara sa vrea interfata nativa). Insa QT fara programatorii ce implementeaza codul specific platformei nu ar exista. Nu inseamna ca e rau ! Fiecare programeaza pe nivelul dorit. Iar daca vrei sa cunosti mai multe despre Windows si programarea pe aceasta platforma atunci nu QT iti dezvaluie "secretele" ci WinAPI cu tot ce inseamna el.

tudor_t
Membru
Membru
Posts: 112
Joined: 26 Aug 2007, 15:11

Re: C++ User Interface

Post by tudor_t » 13 Aug 2013, 17:58

Un "standard C++ GUI library" ar fi nice, dar e un ideal greu de realizat (cum recunoaste si Stroustrup: http://www.stroustrup.com/bs_faq.html#gui )
(in Java au incercat asa ceva - AWT, Swing etc si e greu de spus in ce masura au reusit, chiar daca e o singura companie in spate..)

User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Re: C++ User Interface

Post by curiosul » 13 Aug 2013, 22:07

@tudor_t: Nici nu stii cat ma bucur ca ai postat link-ul acela. O gramada de alte raspunsuri acolo, o sa-l recomand si altora.

Ca sa trag o concluzie la ce mi-au zis colegii mai sus trec pe wxWidgets. Sper sa fie o decizie buna.
Cea mai buna batalie este cea castigata fara lupta.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: C++ User Interface

Post by Ovidiu Cucu » 14 Aug 2013, 13:59

curiosul wrote:Ca sa trag o concluzie la ce mi-au zis colegii mai sus trec pe wxWidgets. Sper sa fie o decizie buna.
O fi, insa eu nu vad in ce au zis colegii mai sus, din ce as trage concluzia ca wxWidgets ar fi o alegere buna. :)

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: C++ User Interface

Post by neagu_laurentiu » 14 Aug 2013, 15:41

wxWidgets e intr-o proportie de ~90% asemanator cu MFC. Insa in ultimii ani dezvoltarea merge destul de greu, mai ales de cand QT a adoptat si licenta LGPL iar daca ne uitam la functionalitatile oferite de QT vs. wxWidgets atunci QT castiga detasat.

Post Reply