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) GtkWidget * WindowC::CreateMenuListItem( GtkWidget * menu, char * szNazwa, int key, GCallback functodo, GtkWindow * pWindow, GtkAccelGroup * shortcut ) { GtkWidget * elmenu; elmenu = gtk_menu_item_new_with_label( szNazwa ); g_signal_connect( GTK_OBJECT( elmenu ), "button_press_event", G_CALLBACK( functodo ), pWindow ); 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; 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 ); vbox = gtk_vbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( window ), vbox ); menubar = gtk_menu_bar_new(); gtk_box_pack_start( GTK_BOX( vbox ), menubar, FALSE, TRUE, 0 ); 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 ); 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 ) ); 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 ); 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 ); tempelmenu = CreateMenuListItem( smenu,( char * ) g_strdup( "Autorzy" ), GDK_a, G_CALLBACK( show_autor_info ), GTK_WINDOW( window ), shortcut ); pack = gtk_label_new( "Coś tam napisane" ); gtk_container_add( GTK_CONTAINER( vbox ), pack ); gtk_widget_show_all( window ); } |
|
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). |
|
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. |
|
DejaVu |
» 2011-11-21 18:45:38 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?
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:
g_signal_connect( GTK_OBJECT( bla ), "bla", G_CALLBACK( G_CALLBACK( _inne_costam_ ) ), pBla );
Wątpię aby zapis:
G_CALLBACK( G_CALLBACK( _inne_costam_ ) )
był równoważny zapisowi:
G_CALLBACK( _inne_costam_ )
PS. Podstawowe kontrolki
PSS. Nie używałem nigdy tej biblioteki więc istnieją spore szanse, że się mylę... |
|
Draqun Temat założony przez niniejszego użytkownika |
» 2011-11-22 19:16:21 Niestety nie pomogło? Wiesz dlaczego? Uruchom sobie program
#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 :) |
|
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 :) |
|
« 1 » |