Kezdőlap > Programozás > Vala programozás II. – Helló GTK+!

Vala programozás II. – Helló GTK+!

Az előző bejegyzésben bemutattam röviden a Vala programozási nyelvet, és csináltam egy „Helló világ!” példaprogramot. Most egy komolyabb programot fogunk készíteni, amely egy egyszerű grafikus programocska lesz. Ehhez a GTK+ grafikus eszközkészletet fogjuk alkalmazni. A GTK+ eredendően egy C-ben írt függvénykönyvtár, amely a Vala-hoz hasonlóan a GObject típusrendszerét alkalmazza. A Vala nyelv megjelenése előtt kétféle lehetőségünk volt a használatára: vagy használtuk a natív C-s függvényeket (ez komolyabb programok esetén egy idő után nehéz feladat) vagy ún. csomagoló (wrapper) interfészeket használtunk más programozási nyelvekkel. A Vala lényegében GTK+/GNOME alkalmazások készítése során egy harmadik alternatívát ad, hiszen itt nincs szükség komoly wrapperrek használatára (egyszerű szöveges fájlokat használ erre), és a programozási nehézségeket is kiküszöböli. A C nyelv legnagyobb nehézsége az, hogy a gyakorta szükséges műveletekre nincsenek sztenderd megoldások, tehát magas absztrakciós szintet igénylő esetekben kellemetlen a használata.

A GTK+-ról röviden

A GTK+ a GNOME platform grafikus eszközkészlete. Tehát miden grafikus felülettel rendelkező GNOME alkalmazás használja. Mint a platform legtöbb függvénykönyvtára ez is jól portolható, létezik Linux, Windows, Mac OS X és BSD változata is (többek között). A GNOME és a GTK+ aktuális főverziója is a 3-as számú, ezt fogjuk használni.

A fejlesztéshez szükséges állományokat az Ubuntu 11.10-ben a libgtk-3-dev csomag telepítésével érhetjük el.

Példaprogram

A programot (majdnem) soronként fogom bemutatni, kitérve a lényeges funkciókra:

using Gtk;

Itt jelezzük, hogy a programban használjuk a Gtk névteret, így majd a névtérbe tartozó objektumokat közvetlenül hívhatjuk, azonban vigyáznunk kell a névütközéskre.

class Pelda : GLib.Object {
    public static int main (string[] args) {

Az osztálydefinícióban láthatjuk, hogy a Pelda osztályunk a GLib.Object alosztálya. Itt jegyezném meg hogy (szinte) minden osztálynak ennek az alosztályának kell lennie – kivételek vannak. A GLib névtér megadása alapesetben nem lenne feltétlenül szükséges, mivel a GLib névteret implicit módon használjuk, de a névütközések miatt mégis megtesszük. Jelen esetben például probléma lenne, hiszen a Gtk névtérben is szerepel Object osztály.

        // A GTK+ inicializálása
        Gtk.init(ref args);

Itt átadjuk a GTK+-nak a program argumentumait, a ref kulcsszó azt jelzi, hogy az átadás referencia szerint történik.

        // Új ablak kétrehozása, és pár tulajdonság beállítása
        var window = new Window();
        window.title = "GTK+ Példaprogram";
        window.border_width = 5;
        window.window_position = WindowPosition.CENTER;
        window.set_default_size (300, 100);
        window.destroy.connect(Gtk.main_quit);

Itt három dolgot jegyeznék meg. Az első a var kulcsszó, amely arra szolgál, hogy kevesebbet kelljen gépelnünk, ha a definíció jobb oldala egyértelműen meghatározza a típust.

A második az adattagok megadása. Ha ez Java forráskód lenne azt hihetnénk, hogy publikus adattagokat használunk, de nem erről van szó, hanem tulajdonságokat használunk (attribute), tehát implicit módon set függvényeket hívunk meg, így nem sértjük az objektum-orientált programozás alapelveit.

Végül pedig az utolsó sor. Itt a window objektum destroy szignáljához kötünk kezelőmetódust, a beépített main_quit metódust. A destroy szignál akkor adódik ki, ha bezárjuk a programablakot. Ekkor lefut a kezelőmetódus, amely kilépteti a programot a főciklusból (ld. később).

        // Gomb létrehozása
        var button = new Button.with_label("Kattints ide!");
        button.clicked.connect (() => {
            button.label = "Köszi!";
        });

Itt létrehozunk egy gombot, a Button osztály nevesített konstruktorával. Eztán a gomb kattintási szignáljához kötünk egy kezelőmetódust. Ez a metódus névtelen metódus vagy másnéven lambda kifejezés.

        // Gomb hozzáadása az ablakhoz, majd megjelenítés
        window.add(button);
        window.show_all();
        // Főciklus indítása
        Gtk.main();
        return 0;
    }
}

Itt jól látható az előbb említett főciklus. Ez addig fut amíg meg nem hívódik a main_quit() metódus.

A programból sok funkciót meg lehetett ismerni, de előre kell szögezni, hogy a  grafikus elemek (widgetek) programkóddal történő leírása rossz gyakorlat!

A következő bejegyzés a grafikus elemek leírónyelvvel történő megadásával fog foglalkozni, és a Builder osztállyal.

A teljes forráskód:

using Gtk;

class Pelda : GLib.Object {
    public static int main (string[] args) {
        // A GTK+ inicializálása
        Gtk.init(ref args);
        // Új ablak kétrehozása, és pár tulajdonság beállítása
        var window = new Window();
        window.title = "GTK+ Példaprogram";
        window.border_width = 5;
        window.window_position = WindowPosition.CENTER;
        window.set_default_size (300, 100);
        window.destroy.connect(Gtk.main_quit);
        // Gomb létrehozása
        var button = new Button.with_label("Kattints ide!");
        button.clicked.connect (() => {
            button.label = "Köszi!";
        });
        // Gomb hozzáadása az ablakhoz, majd megjelenítés
        window.add(button);
        window.show_all();
        // Főciklus indítása
        Gtk.main();
        return 0;
    }
}

A program fordítása némiképp megváltozik, hiszen a gtk csomagot is bele kell fordítani, ezért a fordítás során használjuk a -pkg gtk+-3.0 kapcsolót.

Reklámok
Kategóriák:Programozás Címke: , , , ,
  1. Még nincs hozzászólás.
  1. No trackbacks yet.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: