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ść
ison
» 2012-08-20 20:00:50
Tak. Przecież przy polskich znaków kompilator wyświetla błędy :P
Lepszej wymówki nie widziałem ;)
P-63118
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-20 20:03:22
Lepszej wymówki nie widziałem ;)
No chyba nie myślisz, że piszę wr_ć przez u? :P
P-63119
m4tx
» 2012-08-20 20:03:43
Tak. Przecież przy polskich znaków kompilator wyświetla błędy :P
No to może po prostu
wroc()
? :P Dobrą pratyką jest pisanie wszystkiego (z komentarzami włącznie) po angielsku :)

czemu przyciski nie reagują? Dlaczego? To mnie doprowadzi do depresji.
Podejrzewam, że sygnałów do przycisków w menu nie podpinasz.

Radzę przećwiczyć działanie sygnałów :)
P-63120
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-20 20:51:26
No to może po prostu wroc()? :P
Wruc lepiej brzmi:P

Dobrą pratyką jest pisanie wszystkiego (z komentarzami włącznie) po angielsku :)
Miałem napisać
return
zamiast wróć? <trollface>
----
Podejrzewam, że sygnałów do przycisków w menu nie podpinasz.
Przyciski od menu mają obsługę w funkcji main. Gdy dałem g_signal... w funkcji wruc, to zadziałało.
Inna sprawa, że przyciski od wyboru poziomu trudności też mają obsługiwane zdarzenia w main() i działa o_O.

Radzę przećwiczyć działanie sygnałów :)
Myślę, że dobrze mam to opanowane, bo to proste jak konstrukcja cepa (Przynajmniej z kursu na tej stronie. Chyba, że czegoś jeszcze muszę się douczyć. Tylko nie ze strony po angielsku ).
P-63133
Badman
» 2012-08-20 22:27:50
Nie mam możliwości sprawdzenia, lecz już wcześniej w którymś tam poście używałeś destroy, czyli likwidowałeś kontrolkę, być może tu jest to samo. Kiedy ją zniszczysz zwalniasz m.in. pamięć przydzieloną dla niej, wtedy wskaznik wskazuje na zupełnie coś innego, dlatego należy przed operacjami na kontrolce utworzyć ją od początku, w zależności od jej rodzaju którąś z funkcji gtk_new
btw. tak tylko strzelam :-)
P-63140
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-21 16:39:19
Tak, przyciski tworzę na nowo w funkcji wrÓc() i nie działają :(
P-63191
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-23 21:46:45
Odświeżam.
Problem ciągle ten sam, po wyjściu z "gry" przyciski menu nie działają.
Wklejam skrócony kod. Bardzo proszę o pomoc!
C/C++
#include <gtk/gtk.h>
using namespace std;

struct struktura
{
    GtkWidget * sokno;
    GtkWidget * svbox;
    GtkWidget * start;
    GtkWidget * wwyjdz;
    GtkWidget * hbox;
    GtkWidget * latwy;
    GtkWidget * fixed2;
    GtkWidget * etgr;
    GtkWidget * etwyb;
    GtkWidget * powrot;
    int czystart;
};

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 );
   
    sss->start = gtk_button_new_with_label( "Start" );
    sss->wwyjdz = gtk_button_new_with_label( "Wyjdź" );
   
    gtk_box_pack_start( GTK_BOX( sss->svbox ), sss->start, TRUE, TRUE, 2 );
    gtk_box_pack_start( GTK_BOX( sss->svbox ), sss->wwyjdz, TRUE, TRUE, 2 );
   
    gtk_widget_show_all( sss->svbox );
}

void wruc( GtkWidget * widget, gpointer dane )
{
    struct struktura * sss;
    sss =( struct struktura * ) dane;
   
    gtk_widget_destroy( sss->fixed2 );
   
    sss->svbox = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( sss->sokno ), sss->svbox );
   
    sss->start = gtk_button_new_with_label( "Start" );
    sss->wwyjdz = gtk_button_new_with_label( "Wyjdź" );
   
    gtk_widget_show( sss->start );
    gtk_widget_show( sss->wwyjdz );
   
    gtk_box_pack_start( GTK_BOX( sss->svbox ), sss->start, TRUE, TRUE, 2 );
    gtk_box_pack_start( GTK_BOX( sss->svbox ), sss->wwyjdz, TRUE, TRUE, 2 );
   
    gtk_widget_show_all( sss->svbox );
}

void wybierzpoziom( GtkWidget * przycisk, gpointer dane )
{
    struct struktura * sss;
    sss =( struct struktura * ) dane;
   
    gtk_widget_hide( sss->start );
    gtk_widget_hide( sss->wwyjdz );
   
    gtk_widget_destroy( sss->svbox );
    sss->czystart = 1;
   
    char * txt = "<span fgcolor='#6666CC'><span font='14'>Wybierz poziom trudności:</span></span>";
   
    sss->etwyb = gtk_label_new( txt );
    gtk_label_set_markup( GTK_LABEL( sss->etwyb ), txt );
   
    sss->hbox = gtk_fixed_new();
    gtk_container_add( GTK_CONTAINER( sss->sokno ), sss->hbox );
   
    gtk_widget_set_size_request( sss->latwy, 85, 35 );
   
    gtk_fixed_put( GTK_FIXED( sss->hbox ), sss->latwy, 150, 100 );
    gtk_widget_show_all( sss->hbox );
}

void gra( GtkWidget * widget, gpointer dane )
{
    struct struktura * sss;
    sss =( struct struktura * ) dane;
   
    char * txt = "<span fgcolor='#6666CC'><span font='14'>Tu będzie gra</span></span>";
   
    gtk_widget_destroy( sss->hbox );
    sss->fixed2 = gtk_fixed_new();
    gtk_container_add( GTK_CONTAINER( sss->sokno ), sss->fixed2 );
   
    gtk_container_add( GTK_CONTAINER( sss->fixed2 ), sss->powrot ); // przycisk powrót
    gtk_widget_set_size_request( sss->powrot, 104, 26.9 );
    gtk_fixed_put( GTK_FIXED( sss->fixed2 ), sss->powrot, 2, 210 );
   
    sss->etgr = gtk_label_new( txt );
    gtk_label_set_markup( GTK_LABEL( sss->etgr ), txt );
    gtk_container_add( GTK_CONTAINER( sss->fixed2 ), sss->etgr );
    gtk_fixed_put( GTK_FIXED( sss->fixed2 ), sss->etgr, 10, 10 );
   
    gtk_widget_show_all( sss->fixed2 );
}

int main( int argc, char * argv[] )
{
    struct struktura sss;
   
    GtkWidget * wyjdz;
    GtkWidget * platwy;
   
    gtk_init( & argc, & argv );
    sss.sokno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_position( GTK_WINDOW( sss.sokno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( sss.sokno ), 250, 250 );
    gtk_window_set_title( GTK_WINDOW( sss.sokno ), "gra" );
    gtk_container_set_border_width( GTK_CONTAINER( sss.sokno ), 5 );
    sss.czystart = 0;
   
    platwy = gtk_button_new_with_label( "Łatwy" );
    sss.powrot = gtk_button_new_with_label( "Powrót do menu" );
   
    sss.latwy = platwy;
    sss.wwyjdz = wyjdz;
   
    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.powrot ), "clicked", G_CALLBACK( wruc ), & sss );
    g_signal_connect( G_OBJECT( sss.start ), "clicked", G_CALLBACK( wybierzpoziom ), & sss );
   
    g_signal_connect( G_OBJECT( sss.wwyjdz ), "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-63474
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-24 20:23:57
Znów odświeżam. Ktoś coś chyba mówił, że zdarzenie trzeba obsługiwać, po utworzeniu przycisków (czy ich wyświetleniu?), teraz patrzę, to nikt nic takiego nie napisał o_O, więc chciałem utworzyć przyciski menu w funkcji main(), dać je do struktury i wyświetlać w odpowiednich funkcjach. Oczywiście znowu coś: przyciski nie wyświetlają się po kliknięciu "powrót do menu."
 Dlaczego tak się dzieje? Jak można temu zaradzić? To może być rozwiązanie mojego problemu, bo gdy dla eksperymentu przeniosłem kod tworzący przycisk wybierający trudność do funkcji rysującej menu wyboru trudności, przestał działać. Chyba w tym jest problem...
 Jak już mówiłem przyciski menu nie wyświetlają się po ponownym wejściu w menu. Myślę, że to przez niszczenie kontenerów np.

C/C++
#include <gtk/gtk.h>
using namespace std;

int main( int argc, char * argv[] )
{
    GtkWidget * przycisk;
    GtkWidget * kontener;
    GtkWidget * okno;
   
    gtk_init( & argc, & argv );
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 150, 100 );
    gtk_window_set_title( GTK_WINDOW( okno ), "aaa" );
    gtk_container_set_border_width( GTK_CONTAINER( okno ), 5 );
    //
    przycisk = gtk_button_new_with_label( "przycisk" );
   
    kontener = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( okno ), kontener );
    gtk_box_pack_start( GTK_BOX( kontener ), przycisk, TRUE, TRUE, 0 );
    //x
    gtk_widget_destroy( kontener );
    kontener = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( okno ), kontener );
    gtk_box_pack_start( GTK_BOX( kontener ), przycisk, TRUE, TRUE, 0 );
    //x
    g_signal_connect( G_OBJECT( przycisk ), "clicked", G_CALLBACK( gtk_main_quit ), NULL );
   
    //
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    gtk_widget_show_all( okno );
    gtk_main();
    return 0;
}

 Ten kod wyświetla, przycisk, po którego kliknięciu okno znika. Pod warunkiem, że usunę kod między
komentrzami //x. Ten kod niszczy kontener, w którym jest przycisk, ale po chwili, tworzy go od nowa i umieszcza w nim przycisk. I to nie działa(przycisk się nie pojawia), a bez takich operacji normalnego programu się napisać nie da.
Dlaczego przycisk się nie wyświetla? Co się z nim dzieje?
Trochę się rozpisałem, liczę na pomoc.
P-63547
1 « 2 »
Poprzednia strona Strona 2 z 2