Frågor och svar

1. gtkmm:s plats i världen

Vad är GTK?

GTK är GUI-komponentverktygslådan, skriven i C, vilken tjänar som grunden för GNOME-projektet såväl som för många fristående program. GTK är grunden på vilken gtkmm är byggt. Se https://www.gtk.org.

Varför heter det gtkmm?

gtkmm kallades ursprungligen gtk-- eftersom GTK i början hette GTK+ och hade ett + i namnet. Men eftersom -- inte lätt kan indexeras av sökmotorer så gick paketet allmänt under namnet gtkmm vilket vi sedan höll oss till.

Varför använda gtkmm i stället för GTK?

  • gtkmm låter dig skriva kod med vanliga C++-tekniker som inkapsling, härledning och polymorfism. Som C++-programmerare inser du förmodligen redan att detta leder till tydligare och bättre organiserad kod.
  • gtkmm är mer typsäkert, så kompilatorn kan upptäcka fel som bara skulle upptäckas vid körning om du använde C. Denna användning av specifika typer gör också API:t tydligare eftersom du kan se vilka typer som ska användas bara genom att titta på en metods deklaration.
  • Arv kan användas för att härleda nya komponenter. Härledandet av nya komponenter i GTK:s C-kod är så komplicerad och inbjudande till fel, så att nästan inga C-kodare gör det. Som C++-utvecklare vet du att härledning är en viktig teknik i objektorientering.
  • Medlemsinstanser kan användas vilket förenklar minneshantering. Alla C-komponenter i GTK hanteras genom användning av pekare. Som C++-kodare vet du att pekare ska undvikas när möjligt.
  • Mindre kod. GTK:s C-objektmodell använder prefixade funktionsnamn och typkonverteringsmakron. Till exempel: gtk_button_set_text(GTK_BUTTON(button), "litetext"); gtkmm:s C++-kod är kortare och tydligare. Till exempel: button.set_text("litetext");
  • Det finns ingen anledning att oroa sig över GTK:s referensräkningspolicy.

Varför använda libsigc++? Varför inte använda GTK:s signalfunktioner?

  • GTK-signaler är inte typsäkra. Kompilatorn kan inte säga dig om ditt återanrop har fel antal eller typ av argument eller returvärde.
  • De kan endast användas med funktioner eller statiska metoder. Med libsigc++ kan återanrop också vara instansmetoder, och använda medlemsdata för ett specifikt objekt. De kan också vara virtuella metoder som du skulle kunna åsidosätta i en härledd klass.

Varför är inte GTK/GNOME självt skrivet i C++?

  • C är ett enklare språk, så fler är bekanta med det, särskilt på Unix.
  • C kan ha ett omslag av vilket annat språk som helst, vilket gör API:t tillgängligt för fler utvecklare.
  • GTK och GNOME har mycket välorganiserad C-kod, mycket vettigare än den mesta C-kod vi stöter på. Detta är delvis på grund av dess C-baserade objektorienterade struktur.

Varför inte använda Qt om ni gillar C++ så mycket?

gtkmm-utvecklare tenderar att föredra gtkmm över Qt för att gtkmm gör saker på ett mer C++-aktigt sätt. Qt härstammar från en tid då C++ och standardbiblioteket varken standardiserats eller hade ordentligt stöd av kompilatorer. Det duplicerar därför mycket saker som nu är i standardbiblioteket, som behållare och typinformation. I synnerhet modifierade de C++-språket så det tillhandahöll signaler, så Qt-klasser kan inte lätt användas med klasser som inte är Qt. gtkmm kunde använda standard-C++ för att tillhandahålla signaler utan att ändra C++-språket.

gtkmm och de andra *mm-modulerna låter dig även bygga programvara som arbetar närmare med GNOME-skrivbordet.

2. Hur bra är gtkmm?

Vilka system kör det under?

gtkmm bör kunna köra under alla system av UNIX-typ med rätt kompilatorer och bibliotek installerade. GNU:s C++-kompilator (g++, del av gcc) tillsammans med GNU-verktygslådan (som den hittas på Linux- och *BSD-system) utgör dess standardbyggmiljö. Det kan också köras och användas på Windows med mingw-byggverktygen eller MSVC.

Hur komplett är det?

gtkmm försöker erbjuda all funktionalitet som erbjuds av GTK. Detta betyder att du ska kunna göra allt med gtkmm som stöds av GTK, och göra det enklare. Om det är något som inte täcks så vill vi veta detta.

GLib innehåller klasser med liknande funktionalitet som C++-standardklasser, exempelvis GThread och GTree. Sådana GLib-klasser är inte omslagna i glibmm.

Använder gtkmm C++-standardbehållare som std::string och std::vector?

Ja, vi tror på att återanvända C++-standardkod närhelst möjligt. Detta kanske inte är uppenbart först eftersom gtkmm har Glib::ustring som har nästan samma gränssnitt som std::string. Glib::ustring finns för att C++-standarden inte har bra stöd för UTF8-kodade strängar.

Hur är gtkmm jämfört med Qt?

  • gtkmm använder ren C++. Qt kräver tillägg till C++ som tolkas av moc-preprocessorn.
  • gtkmm använder std::string, std::vector, iteratorer och så vidare. Qt har sina egna Qt-specifika behållare.
  • Med gtkmm kan vanlig C++-minneshantering användas. Qt kräver att alla komponenter behandlas som pekare, och att borttagning av komponenter delegeras till föräldrakomponenter.
  • Arrangemang av komponenter verkar vara lättare i gtkmm. I Qt är behållare och layout olika klasser, och barnkomponenter måste läggas till i båda.
  • gtkmm-API:t tenderar att vara mer direkt. Beteendet hos Qt-klasser beror ofta på de implicita effekterna hos åsidosatta konstruktorer.

3. Ytterligare information

Var kan gtkmm diskuteras?

Se sidan diskussion.

Vilken dokumentation finns för gtkmm?

Se sidan dokumentation.

Var kan jag hitta exempelkod?

Se exempelkatalogen i modulen gtkmm-documentation. De flesta av dessa finns i gtkmm-boken.

4. Använda gtkmm

Vilka kompilatorargument ska jag använda för att kompilera ett gtkmm-program?

Se referensdokumentationen.

Hur kan jag få GTK-objektet från ett gtkmm-objekt?

Om du behöver någon GTK-funktionalitet som inte stöds genom gtkmm så kan du anropa metoden gobj() i den relevanta klassen, som kommer returnera en pekare till GTK-objektet i C. Du kan sedan operera direkt på detta C-objekt som du skulle göra i vilket GTK-program som helst.

Hur kan jag göra ett omslag till en GTK-komponent i en gtkmm-instans?

Glib::wrap() kommer ge dig en pekare till ett gtkmm-objekt. Det är en överlagrad funktion, så den kommer ge dig en instans av den lämpliga klassen.

Kan jag använda C++-undantag med gtkmm?

Ja, men det finns begränsningar. Eftersom vanligt C inte vet vad ett C++-undantag är så kan du använda undantag i din gtkmm-kod så länge som det inte finns några C-funktioner i din anropsstack mellan kastare och fångare. Detta betyder att du måste fånga ditt undantag lokalt.

Du kommer varnas vid körning om ofångade undantag, och du kan ange en annan hanterare för ofångade undantag. Vissa gtkmm-metoder använder undantag för att rapportera fel. Undantagstyperna som kan kastas listas i referensdokumentationen för dessa metoder.

Kan jag använda Cambalache eller Glade med gtkmm?

Se kapitlet Gtk::Builder i gtkmm-boken. Cambalache ersätter programmet Glade. Glade kan inte användas med GTK4/gtkmm4.

Vad gör Gtk::make_managed<T>(args)?

Detta betyder att Behållarkomponenten kommer ta bort denna barnkomponent. Använd det om du inte vill oroa dig om när du ska ta bort dynamiskt allokerade komponenter.

Hur kan jag lära mig arrangera komponenter? Jag blir förvirrad av packningsalternativen.

Cambalache är ett utmärkt sätt att se vad som kan göras med GTK- och GNOME-komponenter. Använd Cambalache för att utforska komponentvalen och för att se hur de kan sättas ihop.

Jag är van vid MFC (Microsoft Foundation Class Library). Var är Document och View?

Document/View (som är en version av programdesignmönstret Model–View–Controller (MVC)) stöds inte direkt av GTK. Klasserna Gtk::TextView and Gtk::ListView är dock uppdelade i modell och vy.

Hur läser jag in bilder för användning med gtkmm?

Använd Gdk::Pixbuf och/eller Gtk::Image. Båda är enkla att använda och stöder en bred mängd bildfiltyper.

Är gtkmm trådsäkert?

Varken GTK eller gtkmm är trådsäkra. All GUI-kod måste köras i samma tråd. Om ditt program skulle kunna dra nytta av att använda flera trådar, se kapitlet flertrådade program i gtkmm-boken.