Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Gtk+, a programowanie obiektowe.

Ostatnio zmodyfikowano 2012-08-24 20:23
Autor Wiadomość
czosnek17
Temat założony przez niniejszego użytkownika
Gtk+, a programowanie obiektowe.
» 2012-08-19 17:18:17
W gtk łatwiej i lepiej pisać programy obiektowo, czy normalnie? Piszę normalnie i co chwilę są jakieś problemy. Np teraz kończyłem pisać gui do gry, ale po ponownym wyświetleniu menu przyciski nie reagują... To jest męczące.
P-62978
RazzorFlame
» 2012-08-19 17:33:07
Obiekty prawie zawsze skracają ilość linii kodu i łatwiej jest pisać
P-62980
m4tx
» 2012-08-19 17:47:46
Np teraz kończyłem pisać gui do gry, ale po ponownym wyświetleniu menu przyciski nie reagują...
Źle sygnały podłączasz or something :P

@RazzorFlame, zwróć uwagę, że on pyta o GTK+.

Szczerze powiedziawszy, w GTK+ jakoś nigdy mi obiektowe pisanie nie było potrzebne :P Aczkolwiek jeśli planujesz pisać własne widżety to już raczej nie ma wyjścia...
P-62982
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-19 18:07:14
Aczkolwiek jeśli planujesz pisać własne widżety to już raczej nie ma wyjścia...
Nie, nigdy o tym nie słyszałem :P

Funkcje obsługę wszystkich zdarzeń mam na końcu programu i działa tylko po włączeniu programu. Jak wrócę do menu z gry, to nic się nie dzieje po kliknięciu na przyciski. Muszę obsługiwać zdarzenia po ostatniej funkcji w programie, a to ostatecznie doprowadzi do bałaganu w kodzie.
P-62984
Badman
» 2012-08-20 00:00:22
Uważam, że masz coś namieszane w kodzie.
Jeżeli całkowicie chcesz pisać obiektowo to przeżuć się na gtkmm.
P-63025
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-20 19:03:25
Mój problem raczej nie wynika z namieszania w kodzie, tylko chyba nie do końca rozumiem budowę programu w gtk...
Dlaczego po funkcji wruc program nie rysuje menu? Przecież po wywołaniu tej funkcji jest instrukcja, która powinna to zrobić!? Wstawiam ogólną budowę programu. Jakby co, mogę dać normalny kod. Poza tym wszystko działa.

C/C++
#include <gtk/gtk.h>

struct struktura
{
    //struktura
};

void rysujmenu( GtkWidget * przycisk, gpointer dane )
{
    struct struktura * sss;
    sss =( struct struktura * ) dane;
   
    sss->svbox = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( sss->sokno ), sss->svbox );
   
    // rysowanie przycisków i menu
   
    gtk_widget_show_all( sss->svbox );
}

void wruc( GtkWidget * widget, gpointer dane )
{
    //...
    sss->kont = 12;
    gtk_widget_destroy( sss->fixed2 );
}

void wybierzpoziom( GtkWidget * przycisk, gpointer dane )
{
    //...
    gtk_widget_destroy( sss->svbox );
    sss->czystart = 1;
   
    sss->hbox = gtk_fixed_new();
    gtk_container_add( GTK_CONTAINER( sss->sokno ), sss->hbox );
   
    // widgety
    gtk_widget_show_all( sss->hbox );
}

void gra( GtkWidget * widget, gpointer dane )
{
    //...                              
   
    gtk_widget_destroy( sss->hbox ); // niszczenie kontenera od wyboru trudności
   
    sss->fixed2 = gtk_fixed_new();
    gtk_container_add( GTK_CONTAINER( sss->sokno ), sss->fixed2 );
   
    /* tworzenie widgetów */
   
    gtk_widget_show_all( sss->fixed2 );
}

int main( int argc, char * argv[] )
{
    /* daklaracja
    zmiennych;
    tworzenie okna itd;
    tworzenie przycisków "latwy", "trudny", "powrot"
        */
   
    struct struktura sss;
   
    sss.czystart = 0;
   
   
    if( sss.czystart == 0 )
    {
        rysujmenu( NULL, & sss );
    }
   
    g_signal_connect( G_OBJECT( sss.latwy ), "clicked", G_CALLBACK( gra ), & sss );
   
    g_signal_connect( G_OBJECT( sss.start ), "clicked", G_CALLBACK( wybierzpoziom ), & sss );
   
    g_signal_connect( G_OBJECT( sss.powrot ), "clicked", G_CALLBACK( wruc ), & sss );
   
   
    if( sss.kont == 12 )
    {
        rysujmenu( NULL, & sss );
    }
   
    g_signal_connect( G_OBJECT( wyjdz ), "clicked", G_CALLBACK( gtk_main_quit ), NULL );
    g_signal_connect( G_OBJECT( sss.sokno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    gtk_widget_show_all( sss.sokno );
    gtk_main();
    return 0;
}
P-63106
m4tx
» 2012-08-20 19:42:25
Przecież po wywołaniu tej funkcji jest instrukcja, która powinna to zrobić!?
Nie. Instrukcję tę masz pod podpinaniem sygnałów, czyli generalnie to nigdy zadziała (nigdy kont nie będzie miało wartości 12, zanim nie wyświetlisz GUI) - program zaczyna wyświetlać GUI i reagować dopiero od momentu wywołania gtk_main(). Pamiętaj też, że nawet, jak przesuniesz tego ifa pod gtk_main(), to to i tak nie zadziała - musisz wyświetlanie menu dać w funkcji wruc(). Radzę przećwiczyć działanie sygnałów :)

I btw., - "wruc"?
P-63112
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-20 19:52:11
I btw., - "wruc"?
Tak. Przecież przy polskich znaków kompilator wyświetla błędy :P

Dzięki za wytłumaczenie, myślałem, że ta pętla działa bardziej tak jak np w sfmlu.
No, menu się łaskawie wyświetliło, ale czemu przyciski przestały reagować? Dlaczego? To mnie doprowadzi do depresji... Ledwo jeden dziwny problem rozwiązany, to zaraz pojawia się następny, jeszcze dziwniejszy... Czego ja tu jeszcze nie rozumiem...
P-63115
« 1 » 2
  Strona 1 z 2 Następna strona