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

[GTK+] Problemy z menu

Ostatnio zmodyfikowano 2011-11-22 19:25
Autor Wiadomość
Draqun
Temat założony przez niniejszego użytkownika
[GTK+] Problemy z menu
» 2011-11-21 00:54:51
Witam

Otóż pisząc program z użyciem GTK+ napotkałem pewien problem. Polega on na tym, że kiedy próbuję wywołać funkcje poprzez wywołanie ją z menu wywala mi się program. Poza tym nie działają skróty do tych funkcji.

Poniżej zamieszczę kod, kilku funkcji. (PS, jako że nie widzę, żadnych tagów do kodu zamieszczam go takim jaki jest)

C/C++
GtkWidget * WindowC::CreateMenuListItem( GtkWidget * menu, char * szNazwa, int key, GCallback functodo, GtkWindow * pWindow, GtkAccelGroup * shortcut )
{
    GtkWidget * elmenu;
    //GtkWidget *podmenu;
    /* --- tworzymy element menu --- */
    elmenu = gtk_menu_item_new_with_label( szNazwa );
    g_signal_connect( GTK_OBJECT( elmenu ), "button_press_event", G_CALLBACK( functodo ), pWindow );
    /* --- dodajemy je do paska menu --- */
    gtk_menu_append( GTK_MENU( menu ), elmenu );
    gtk_widget_add_accelerator( elmenu, "activate", shortcut, key, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE );
   
    return elmenu;
}
void WindowC::CreateToolbarItem( GtkWidget * toolbar, gchar * stockname, GCallback functodo, int num, GtkWindow * pWindow )
{
    GtkToolItem * newstock;
    newstock = gtk_tool_button_new_from_stock( stockname );
    gtk_toolbar_insert( GTK_TOOLBAR( toolbar ), newstock, num );
    g_signal_connect( GTK_OBJECT( newstock ), "clicked", G_CALLBACK( functodo ), pWindow );
   
}

WindowC::WindowC()
{
    numberoficonplace = 0;
    //tworzymy okno i jego parametry
    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( window ), "iNote" );
    gtk_window_position( GTK_WINDOW( window ), GTK_WIN_POS_CENTER );
    gtk_window_set_icon_from_file( GTK_WINDOW( window ), "ico.png", NULL );
    gtk_widget_set_usize( window, 420, 300 );
    g_signal_connect( window, "delete_event", G_CALLBACK( gtk_main_quit ), NULL );
    //tworzymy pionowe pole pakujące aby menu bylo u góry a reszta poniżej jego
    vbox = gtk_vbox_new( FALSE, 0 );
    gtk_container_add( GTK_CONTAINER( window ), vbox );
    //tworzymy menu
    menubar = gtk_menu_bar_new();
    gtk_box_pack_start( GTK_BOX( vbox ), menubar, FALSE, TRUE, 0 );
   
    //twrzymy pasek narzedziowy z ikonkami
    toolbar = gtk_toolbar_new();
    gtk_toolbar_set_style( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_ICONS );
    gtk_box_pack_start( GTK_BOX( vbox ), toolbar, FALSE, TRUE, 0 ); //dodajemy pasek do kontenera tak aby się nam nie rozjeżdżał
    //dodajemy do paska kolejne elementy
    CreateToolbarItem( toolbar, g_strdup( GTK_STOCK_CONNECT ), G_CALLBACK( LogInToServer ), numberoficonplace++, GTK_WINDOW( window ) );
    CreateToolbarItem( toolbar, g_strdup( GTK_STOCK_ADD ), G_CALLBACK( CreateNewAccount ), numberoficonplace++, GTK_WINDOW( window ) );
   
    //tworzymy kontrolki menu i dodajemy do paska
    fmenu = gtk_menu_item_new_with_label( "Plik" );
    smenu = gtk_menu_new();
    gtk_menu_append( GTK_MENU_BAR( menubar ), fmenu );
    gtk_menu_item_set_submenu( GTK_MENU_ITEM( fmenu ), smenu );
   
    //dodajemy skrót
    shortcut = gtk_accel_group_new();
    gtk_window_add_accel_group( GTK_WINDOW( window ), shortcut );
   
    tempelmenu = CreateMenuListItem( smenu,( char * ) g_strdup( "Zaloguj" ), GDK_l, G_CALLBACK( LogInToServer ), GTK_WINDOW( window ), shortcut );
    tempelmenu = CreateMenuListItem( smenu,( char * ) g_strdup( "Stwórz konto" ), GDK_c, G_CALLBACK( CreateNewAccount ), GTK_WINDOW( window ), shortcut );
    tempelmenu = CreateMenuListItem( smenu,( char * ) g_strdup( "Zakończ" ), GDK_c, G_CALLBACK( gtk_main_quit ), NULL, shortcut );
   
    fmenu = gtk_menu_item_new_with_label( "Pomoc" );
    smenu = gtk_menu_new();
    gtk_menu_append( GTK_MENU_BAR( menubar ), fmenu );
    gtk_menu_item_set_submenu( GTK_MENU_ITEM( fmenu ), smenu );
    //CreateMenu(menubar,&fmenu,&smenu,g_strdup("Pomoc"));
    tempelmenu = CreateMenuListItem( smenu,( char * ) g_strdup( "Autorzy" ), GDK_a, G_CALLBACK( show_autor_info ), GTK_WINDOW( window ), shortcut );
    //ustawiamy sygnały okna
    pack = gtk_label_new( "Coś tam napisane" );
    //GTK_OBJECT(pack)->
    gtk_container_add( GTK_CONTAINER( vbox ), pack );
    //uwidaczniamy wszystkie kontrolki w oknie
    gtk_widget_show_all( window );
}
P-44427
DejaVu
» 2011-11-21 09:11:08
1. Jaka funkcja się wywala
2. Jeżeli się wywala to zapewne jest w niej błąd (np. używanie obiektu, który nie został zaalokowany).
P-44429
Draqun
Temat założony przez niniejszego użytkownika
» 2011-11-21 13:09:42
W momencie kiedy posiadam pasek menu i wybiorę z niego opcję Zaloguj albo Stwórz konto program się wywala. Co dziwne bo te same funkcje wywołują ikonki na pasku i one działają poprawnie. Spójrz na kod jak tworzę całe menu, i jak każdemu z elementów przypisuje funkcję za pomoca g_singnal_connect. Robię to identycznie jak w funkcji tworzącej ikonki na pasku. Niestety te w menu nie działają. Po wybraniu elementu menu program kończy mi się z kodem -1. Nie wiem czy to wynika może z błędnego tworzenia danych elementów.

Innym błędem są skróty klawiszowe, które również nie działają. Porównywałem swój kod z wieloma programami gdzie to działa. Zmieniałem wielokrotnie kod, tworząc ręcznie każdy skrót dla każdego elementu menu, a nie, że tworzy mi to funkcja. Niestety nie działa.

pozdrawiam.
P-44435
DejaVu
» 2011-11-21 18:45:38
C/C++
CreateToolbarItem( toolbar, g_strdup( GTK_STOCK_ADD ), G_CALLBACK( CreateNewAccount ), numberoficonplace++, GTK_WINDOW( window ) );

Jak na mój gust to nie podałeś kompletnego kodu. Nie ma w nim takich pierdół jak np. CreateNewAccount. Ponadto Nie wydaje mi się abyś dobrze używał G_CALLBACK. Dlaczego?

C/C++
void costam( GCallback _funkcja_ )
{
    g_signal_connect( GTK_OBJECT( bla ), "bla", G_CALLBACK( _funkcja_ ), pBla );
}

int main()
{
    costam( G_CALLBACK( _inne_costam_ ) );
    return 0;
}
Moim zdaniem efektem działania tego kodu będzie:
C/C++
g_signal_connect( GTK_OBJECT( bla ), "bla", G_CALLBACK( G_CALLBACK( _inne_costam_ ) ), pBla );
Wątpię aby zapis:
C/C++
G_CALLBACK( G_CALLBACK( _inne_costam_ ) )
był równoważny zapisowi:
C/C++
G_CALLBACK( _inne_costam_ )
PS. » Kurs GTK+, C++Podstawowe kontrolki lekcja

PSS. Nie używałem nigdy tej biblioteki więc istnieją spore szanse, że się mylę...
P-44451
Draqun
Temat założony przez niniejszego użytkownika
» 2011-11-22 19:16:21
Niestety nie pomogło? Wiesz dlaczego? Uruchom sobie program

C/C++
#include <iostream>

int main() {
    int i = 1;
    int j;
    int k;
    j =( int )( i );
    k =( int )( j );
    std::cout << k;
    return 0;
}

Wyświetli ci się jeden. Jestem święcie przekonany, że rzutowanie z jednego typu w ten sam typ jest pomijane podczas optymalizacji kodu przez kompilator. Wbrew pozorom kompilator to nie jest takie głupie narzędzie jak sam zresztą dobrze wiesz :)

@Jak na mój gust to nie podałeś kompletnego kodu. Nie ma w nim takich pierdół jak np. CreateNewAccount.

Po co te pierdoły? Problem tkwi w wyżej wypisanych funkcjach. Tamte funkcje pracują prawidłowo :) w końcu uruchamiam je za pomoca przycisków na panelu, które działają poprawnie w przeciwieństwie do elementów menu.

W każdym bądź razie dziękuję za pomysł. Może jeszcze jakieś propozycje?

Pozdrawiam.
___________________
EDYTKA problem rozwiązany

Zdziwilibyście się, że w błąd wprowadziła mnie dokumentacja. Zamiast w menu pobierać sygnał button_press_event należało podac sygnał activate.  Temat rozwiązany.

Dziękuję i pozdrawiam :)
P-44528
DejaVu
» 2011-11-22 19:25:43
:) Nie wiedziałem, że G_CALLBACK to po prostu cast :) Anyway temat zamykam skoro rozwiązałeś problem :)
P-44530
« 1 »
  Strona 1 z 1