Podstawy Glade + gtkmm

Data: 2018-01-14, autor: Michał Misztal

Nowy rok jakoś nie zaczął się tak jakbym tego chciał. Pierwsze co się zwaliło to jedna kość RAM. Po DDR3 Kingstona tego bym się nie spodziewał. Z DDR2 mieli problemy - to fakt. Cóż, trzeba będzie reklamować. Przynajmniej wiem już skąd te tajemnicze zwiechy.

Nieco odnowiona strona Telewizji Włoszczowa (jeszcze niedostępna) jakoś nie przypadła do gustu właścicielowi. Zmiany kosmetyczne nie są duże ale silnik został przebudowany. RWD, przebudowany panel admina, MVC, większa funkcjonalność, skalowalność. Może i faktycznie ten panel boczny za mały ale to do poprawy.

Kolejna porażka to klasy + GUI Pythona w Tkinter - rzecz ciężkostrawna. Zostanę chyba przy konsoli.

Poszukiwań wygodnych GUI ciąg dalszy. Tym razem Glade dla gtkmm. Nie jest to to samo co Qt, ale przynajmniej mogę sprzedać program bez kodu źródłowego. Aby to zrobić w Qt trzeba kupić licencję - a ta do tanich nie należy. Zwłaszcza, że nie zajmuję się tym zawodowo tylko od czasu do czasu coś wysmarzę.

Co do prób to robiłem je na razie tylko na Linuksie. Kiedyś może i nabiorę odwagi by pobawić się z Glade i gtkmm na Windowsie. Dlaczego nie WxWidgets skoro posiada własnego buildera i działa na Windowsie? Bo nie jest to zbyt stabilne. U mnie przy pierdołach się wywalało. WxWidgets może kiedy indziej.

Glade to budowniczy interfejsu. W nim można wszystko sobie wyklikać. Oczywiście można obyć się bez ale wpisywanie każdego przycisku czy etykiety ręcznie nie należy do najwydajniejszych. No i wygląd interfejsu zobaczymy dopiero po kompilacji, co może trochę trwać. gtkmm to z kolei biblioteka tłumacząca kod obiektowy C++ do kodu C biblioteki graficznej GTK. Czyli możemy obiektowo pisać w GTK.

Powiedzmy, że stworzymy sobie takie przykładowe okno

Ryc. 1. Z butów nie wyrywa

Ok, szału nie ma. Ale od czegoś trzeba zacząć. Powiedzmy, że po kliknięciu przycisku w konsoli wyświetli się tekst i ilość kliknięć. Nie przedłużając, oto kod



#include <gtkmm.h>
#include <iostream>

void on_m_but1_clicked(int &i){
    using namespace std;
    i++;
    cout << "Button 1 klik! Ilość kliknięć: " << i <<endl;
}

int main(int argc, char *argv[]){
    /*1*/ int *i = new int(0);
    /*2*/ Glib::RefPtr<Gtk::Application> 
            app = Gtk::Application::create(argc, argv, "myapp");
    /*3*/ Glib::RefPtr<Gtk::Builder>
            builder = Gtk::Builder::create_from_file("gl.glade");
    /*4*/ Gtk::Window *win = nullptr;
    /*5*/ builder->get_widget("Program", win);
    /*6*/ Gtk::Button *pBut1 = nullptr;
    /*7*/ builder->get_widget("m_but1", pBut1);
    /*8*/ pBut1->signal_clicked().connect(
            sigc::bind<int>(sigc::ptr_fun(&on_m_but1_clicked),*i)
            );
    /*9*/ app->run(*win);
    return 0;
}

[user@komputer ~]$ g++ main.cpp -o program `pkg-config gtkmm-3.0 --cflags --libs` && ./program

Dołączamy stosowne nagłówki. Funkcja on_m_but1_clicked przyjmuje wskaźnik do inta którego będziemy inkrementować aby znać ilość kliknięć.

  • 1. Definiujemy licznik, niech to będzie int
  • 2. Na początek trzeba utworzyć aplikację. Można napisać krócej auto app, C++ sam sobie określi typ zmiennej.
  • 3. Teraz trzeba załadować plik interfejsu - u mnie z pliku "gl.glade".
  • 4. W tym kroku trzeba zadeklarować wskaźnik do naszego okna. Dobrze jest go od razu przypisać, choćby i do nulla.
  • 5. Teraz najfajniejsze. Przypisujemy wskaźnikowi widżet z szablonu (pole "Identyfikator").
  • 6. Inicjalizujemy przycisk.
  • 7. Przypisujemy przycisk.
  • 8. Przypisujemy sygnał do przycisku. sigc::bind oznacza, że wywołanej kliknięciem funkcji podamy argument int. sigc::ptr_fun(&on_m_but1_clicked) oznacza, że ta funkcja zostanie wywołana po kliknięciu.
  • 9. Uruchamiamy aplikację. Czyli przekazujemy nasze okno do obiektu Gtk::Application w celu wykonania.

Wynikiem jest

Ryc. 2. Jak już wspominałem - z butów nie wyrywa

Myśle, że w temat się zagłębię i coś jeszcze poleci.

PS. A skoro dzisiaj gra WOŚP to i link leci - KLIK.

Skomentuj lub zgłoś błąd

© Michał Misztal 2018

Czytasz właśnie

Podstawy Glade + gtkmm
Autor: Michał Misztal
Data: 2018-01-14

Podobne wpisy