Gyakran feltett kérdések

1. A gtkmm helye a világban

Mi a GTK?

A GTK egy C nyelven írt grafikus felhasználói felületi elem eszközkészlet, amely a GNOME-projekt, valamint számos önálló alkalmazás alapját képezi. A GTK az az alap, amelyre a gtkmm épült. Nézze meg a https://www.gtk.org oldalt.

Miért kapta a gtkmm nevet?

A gtkmm eredetileg gtk-- néven volt ismert, mivel a GTK eredetileg GTK+ néven szerepelt, és a nevében egy + volt. Mivel azonban a -- karaktereket a keresőmotorok nem könnyen indexelik, a csomagot általában gtkmm néven emlegették, és mi is ezt a nevet tartottuk meg.

Miért érdemes a gtkmm használata a GTK helyett?

  • A gtkmm lehetővé teszi, hogy a kódot normál C++ technikák használatával írja meg, mint például a kapszulázás, a származtatás és a polimorfizmus. C++ programozóként valószínűleg már rájött, hogy ez érthetőbb és jobban szervezett kódhoz vezet.
  • A gtkmm típusbiztonságosabb, így a fordító képes felismerni azokat a hibákat is, amelyek C használatakor csak futásidőben derülnének ki. A konkrét típusok használata emellett letisztultabbá teszi az API-t is, mivel már a metódus deklarációjának megtekintésével láthatja, hogy mely típusokat kell használni.
  • Az öröklődés használható új felületi elemek származtatásához. Az új felületi elemek származtatása a GTK C-kódjában annyira bonyolult és hibalehetőségekkel teli, hogy szinte egyetlen C-programozó sem teszi meg. C++ fejlesztőként tudhatja, hogy a származtatás az objektumorientált technikában elengedhetetlen.
  • Használhatók tagpéldányok, ami egyszerűsíti a memóriakezelést. Az összes GTK C felületi elem kezelése mutatók használatával történik. C++ programozóként tudhatja, hogy a mutatókat lehetőség szerint kerülni kell.
  • Kevesebb kód. A GTK C-objektummodell előtaggal ellátott függvényneveket és típusátalakító makrókat használ. Például: gtk_button_set_text(GTK_BUTTON(button), "valamilyen szöveg");. A gtkmm C++ kódja rövidebb és érthetőbb. Például: button.set_text("valamilyen szöveg");
  • Nem kell aggódni a GTK hivatkozásszámlálási szabályai miatt.

Miért érdemes a libsigc++ használata? Miért ne használja a GTK szignálfüggvényeit?

  • A GTK szignáljai nem típusbiztosak. A fordító nem tudja jelezni, ha a visszahívásnak helytelen számú vagy típusú argumentuma vagy visszatérési értéke van.
  • Ezek kizárólag függvényekkel vagy statikus metódusokkal használhatók. A libsigc++ visszahívásai lehetnek példánymetódusok is, amelyek egy adott objektum tagadatait használják. Lehetnek virtuális metódusok is, amelyeket felülbírálhat egy származtatott osztályban.

Maga a GTK/GNOME miért nem C++ nyelven lett írva?

  • A C egy egyszerűbb nyelv, ezért többen ismerik, különösen Unix-környezetben.
  • A C nyelvet bármely más nyelv beágyazhatja, így elérhetővé téve az API-t több fejlesztő számára.
  • A GTK és a GNOME nagyon jól szervezett C-kóddal rendelkezik, amely sokkal áttekinthetőbb, mint a legtöbb C-kód, amellyel találkozunk. Ez részben a C-alapú, objektumorientált szerkezetnek köszönhető.

Miért nem használ Qt keretrendszert, ha ennyire szereti a C++ nyelvet?

A gtkmm-fejlesztők általában a gtkmm-et részesítik előnyben a Qt-vel szemben, mert a gtkmm inkább a C++ stílusában működik. A Qt abból az időből származik, amikor a C++ és a szabványos programkönyvtár még nem volt szabványosítva, vagy a fordítók nem támogatták megfelelően. Ezért sok olyan dolgot kettőz, ami ma már a szabványos programkönyvtárban található, mint például a konténerek és a típusinformációk. A legfontosabb, hogy módosították a C++ nyelvet a szignálok biztosítása érdekében, így a Qt-osztályok nem használhatók egyszerűen nem Qt-osztályokkal együtt. A gtkmm képes volt a szabványos C++ nyelvet használni a szignálok biztosításához, anélkül hogy megváltoztatta volna a C++ nyelvet.

Emellett a gtkmm és a többi *mm modul lehetővé teszi olyan szoftverek összeállítását, amelyek szorosabban együttműködnek a GNOME asztali környezettel.

2. Mennyire jó a gtkmm?

Milyen rendszereken fut?

A gtkmm bármely UNIX-típusú rendszeren futtatható, amelyen a megfelelő fordítók és programkönyvtárak telepítve vannak. A GNU C++ fordító (g++, a gcc része) a GNU eszközkészletével (amely például Linux- és *BSD-rendszereken megtalálható) együtt alkotja az alapértelmezett összeállítási környezetét. Windows rendszeren is összeállítható és használható a mingw összeállítási eszközökkel vagy az MSVC-vel.

Mennyire teljes?

A gtkmm arra törekszik, hogy a GTK által kínált összes funkciót biztosítsa. Ez azt jelenti, hogy képesnek kell lennie arra, hogy a gtkmm segítségével bármit megtehessen, amit a GTK támogat, és ezt még könnyebben is megtehesse. Ha valami kimaradt, akkor szeretnénk, ha jelezné nekünk.

A GLib olyan osztályokat tartalmaz, amelyek funkciói hasonlóak a szabványos C++ osztályokéhoz, például a GThread és a GTree. Az ilyen GLib-osztályok nincsenek becsomagolva a glibmm-ben.

A gtkmm használ olyan szabványos C++ konténereket, mint például az std::string és az std::vector?

Igen, hiszünk a szabványos C++ kód újrahasználatában, ahol csak lehetséges. Ez elsőre talán nem nyilvánvaló, mivel a gtkmm rendelkezik egy Glib::ustring osztállyal, amely szinte ugyanolyan interfésszel rendelkezik, mint az std::string. A Glib::ustring azért létezik, mert a C++ szabvány nem támogatja megfelelően az UTF-8 kódolású karakterláncokat.

Hogyan viszonyul a gtkmm a Qt-hez?

  • A gtkmm tiszta C++-kódot használ. A Qt olyan kiterjesztéseket igényel a C++ nyelvhez, amelyeket a moc előfeldolgozó értelmez.
  • A gtkmm az std::string és az std::vector osztályokat, iterátorokat stb. használ. A Qt-nak megvannak a saját, Qt-specifikus konténerei.
  • A gtkmm-mel a normál C++ memóriakezelés használható. A Qt megköveteli, hogy az összes felületi elem mutatókként legyen kezelve, és hogy a felületi elemek törlése a szülő felületi elemekre legyen delegálva.
  • Úgy tűnik, a felületi elemek elrendezése egyszerűbb a gtkmm-ben. A Qt-ben a konténerek és az elrendezések külön osztályok, és a gyermek felületi elemeket mindkettőhöz hozzá kell adni.
  • A gtkmm API általában egyértelműbb. A Qt-osztályok viselkedése gyakran a felülbírált konstruktorok implicit hatásaitól függ.

3. További információk

Hol lehet a gtkmm-t megvitatni?

Nézze meg a beszélgetés oldalt.

Milyen dokumentáció létezik a gtkmm-hez?

Nézze meg a dokumentációs oldalt.

Hol találhatok néhány példakódot?

Nézze meg a példák könyvtárát a gtkmm-documentation modulban. Ezek többsége szerepel a gtkmm könyvben.

4. A gtkmm használata

Milyen fordítóargumentumokat kell használnom egy gtkmm-program lefordításához?

Nézze meg a hivatkozási dokumentációt.

Hogyan kérhetem le a GTK-objektumot egy gtkmm-objektumból?

Ha olyan GTK-funkciókra van szüksége, amelyek nem támogatottak a gtkmm-en keresztül, akkor a megfelelő osztályban meghívhatja a gobj() metódust, amely egy egyszerű C-beli GTK-objektumra való mutatót ad vissza. Ezután közvetlenül ezen a C-objektumon végezhet műveleteket, ahogyan azt bármely GTK-programban tenné.

Hogyan csomagolhatok be egy GTK felületi elemet egy gtkmm-példányba?

A Glib::wrap() függvény adni fog egy gtkmm-objektumra hivatkozó mutatót. Ez egy túlterhelt függvény, ezért a megfelelő osztály egy példányát fogja adni.

Használhatok C++ kivételeket a gtkmm-mel?

Igen, de vannak korlátozások. Mivel az egyszerű C nem ismeri a C++ kivételeket, a gtkmm-kódban addig használhat kivételeket, amíg nincsenek C-függvények a hívási veremben a kivételt dobó és az elkapó között. Ez azt jelenti, hogy a kivételt helyileg kell elkapnia.

Figyelmeztetést fog kapni futásidőben a nem elkapott kivételekről, és megadhat egy másik kezelőt a nem elkapott kivételekhez. Néhány gtkmm-metódus kivételeket használ a hibák jelentéséhez. A dobható kivételtípusok ezen metódusok hivatkozási dokumentációjában vannak felsorolva.

Hogyan használható a Cambalache vagy a Glade a gtkmm-mel?

Nézze meg a Gtk::Builder fejezetet a gtkmm könyvben. A Cambalache helyettesíti a Glade alkalmazást. A Glade és a GTK4/gtkmm4 nem használható együtt.

Mit csinál a Gtk::make_managed<T>(args) függvény?

Ez azt jelenti, hogy a konténer felületi elem törölni fogja ezt a gyermek felületi elemet. Akkor használja, ha nem szeretne aggódni amiatt, hogy mikor kell törölni a dinamikusan lefoglalt felületi elemeket.

Hogyan tudhatok meg többet a felületi elemek elrendezéséről? Nem értem teljesen a csomagolási beállításokat.

A Cambalache remek módja annak, hogy lássa, mit lehet csinálni a GTK és a GNOME felületi elemeivel. Használja a Cambalache tervezőalkalmazást a felületi elemek választékának felfedezéséhez, és hogy megnézze, hogyan lehet összeállítani azokat.

Az MFC-hez (Microsoft Foundation Class programkönyvtárhoz) vagyok szokva. Hol van a dokumentum és a nézet?

Dokumentum/nézet (amely a modell-nézet-vezérlő, rövidítve MVC szoftvertervezési minta egyik változata) közvetlenül nincs támogatva a GTK által. Azonban a Gtk::TextView és a Gtk::ListView osztályok fel vannak osztva modellre és nézetre.

Hogyan töltsek be képeket a gtkmm-mel való használathoz?

Használja a Gdk::Pixbuf és/vagy a Gtk::Image osztályokat. Mindkettőt egyszerű használni, és a képfájltípusok széles skáláját támogatják.

A gtkmm szálbiztos?

Sem a GTK, sem a gtkmm nem szálbiztos. Az összes grafikus felhasználói felületi kódnak ugyanabban a szálban kell futnia. Ha a programjának előnyös lehet a több szál használata, akkor tekintse meg a többszálas programok fejezetet a gtkmm könyvben.