GTK+ i problem z wywołanie funkcji przez kontrolki

0

Otóz mam pewne problemy z gtk :). Nauka trwa a o odpowiedzi ciężko. więc z góry dziękuje tym, co przyjrzą się mojemu problemowi. Na początku kod

GtkWidget* WindowC::CreateMenuListItem (GtkWidget *menu, char *szNazwa, int ackey, GCallback functodo, gchar *functioninfo, GtkWindow *pWindow)
{
        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), (gpointer)pWindow);
        /* --- dodajemy je do paska menu --- */
        gtk_menu_append (GTK_MENU(menu), elmenu);
        gtk_widget_add_accelerator(elmenu, "activate", shortcut,ackey,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);

        return elmenu;
}
void WindowC::CreateToolbarItem(GtkWidget *toolbar, gchar *stockname, GCallback functodo, gchar *message, 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), (gpointer)pWindow);

}

W wyżej wpisanych funkcjach istnieje pewien błąd. Mianowicie chodzi o przypisanie poprzez g_signal_connect() funkcji do wykonania. Wybranie jednej opcji z menu powinno działać identycznie jak wybrania elementu na pasku skrótów jednak jest inaczej. Oto jak wywołuje powyzsze funkcje

Wywołanie dodania funkcji do menu(które nie działa)

GtkWidget tempelmenu;
tempelmenu=CreateMenuListItem(smenu, (char
)g_strdup("Zaloguj"),GDK_l, G_CALLBACK(LogInToServer), g_strdup("Loguje"), GTK_WINDOW(window));

Wywolanie dodania skrótu do paska(które działa)

GtkWidget *toolbar;
CreateToolbarItem(toolbar, g_strdup(GTK_STOCK_CONNECT), G_CALLBACK(LogInToServer), g_strdup("Loguje 2"), numberoficonplace++, GTK_WINDOW(window));

Oba elementy mają wykonywać tę samą funkcję (która będzie poniżej ponieważ w niej też mam drobny problem) jednak za chiny element w menu nie robi tego. Do tego nie działa do niego tez skrót klawiszowy.

A teraz funkcja, która wywołują

gboolean WindowC::delete_event(GtkWidget *widget, GdkEvent  *event, gpointer   data)
{
    g_print("-> delete_event\n");
    return FALSE;
}
void WindowC::LogInToServer(GtkWidget *widget, GtkWindow *pWindow)
{
    //zmienne okna logowania
    GtkWidget *logwin;
    GtkWidget *button;
    GtkWidget *table;
    GtkWidget *entrylogin;
    GtkWidget *entrypass;

    GtkWidget *label;
    //tworzymy okno i ustawiamy jego parametry
    logwin=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(logwin),"iNote - Logowanie");
    gtk_container_set_border_width (GTK_CONTAINER (logwin), 10);
    gtk_window_position(GTK_WINDOW(logwin), GTK_WIN_POS_CENTER);
    gtk_window_set_resizable(GTK_WINDOW (logwin), FALSE);
    gtk_window_set_decorated(GTK_WINDOW (logwin), TRUE);
    gtk_window_set_transient_for(GTK_WINDOW (logwin),pWindow);
    //tworzymy kontenery
    table=gtk_table_new(3,3,TRUE);
    gtk_container_add(GTK_CONTAINER(logwin),table);
    //kontrolki w oknie
    label=gtk_label_new("Login");
    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
    entrylogin=gtk_entry_new_with_max_length(16);
    gtk_table_attach_defaults(GTK_TABLE(table),entrylogin,1,3,0,1);

    label=gtk_label_new("Hasło");
    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
    entrypass=gtk_entry_new_with_max_length(32);
    gtk_table_attach_defaults(GTK_TABLE(table),entrypass,1,3,1,2);

    button=gtk_button_new_with_label("Zaloguj");
    gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,2,3);
    gtk_signal_connect(GTK_OBJECT(button),"button_press_event",G_CALLBACK (delete_event),NULL);

    button=gtk_button_new_with_label("Anuluj");
    gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,2,3);
    gtk_signal_connect(GTK_OBJECT(button),"button_press_event",G_CALLBACK(NULL),NULL);

    gtk_signal_connect(GTK_OBJECT(logwin),"delete_event",G_CALLBACK (delete_event),NULL);
    gtk_widget_show_all (logwin);
}

Funkcja ta ma na razie tworzyć okno i wyświetlać 2 miejsca do wpisania hasła i loginu. potrzebna jest mi wiedza jak dokladnie za pomocą gtk_entry_get_text() wyciągnąć ze zmiennych entrylogin i entrypass wyciągnąć te rzeczy. Inna bajką jest wyłączane okna. Jak zrobić aby przycisk Anuluj działał tak samo jak kliknięcie krzyżyka?

0
  1. musisz sobie zapisać zmienne entrylogin i entrypass gdzieś, gdzie będzie miała dostęp funkcja callbackowa obsługująca kliknięcie przycisku "loguj". najprościej i najgorzej to wyżej jako zmienne globalne. i czemu obsługujesz button_press_event zamiast clicked?
    a wyciągnąć teks to już prosto:
char *text = gtk_entry_get_text(GTK_ENTRY(kontrolka)) ;
  1. czemu jako callback do buttona zaloguj wybrałeś delete_event, a do anuluj NULL? chyba chcesz obsługiwać kliknięcie zaloguj, a kliknięcie anuluj powinno tylko zniszczyć okno?
0
  1. musisz sobie zapisać zmienne entrylogin i entrypass gdzieś, gdzie będzie miała dostęp funkcja callbackowa obsługująca kliknięcie przycisku "loguj". najprościej i najgorzej to wyżej jako zmienne globalne.

Zmienne globalne to zło. Wczytam je do jakiejś struktury i podam ją jako parametr funkcji G_Callback. To chyba lepszy pomysł

i czemu obsługujesz button_press_event zamiast clicked?

Dzięki ;) http://developer.gnome.org/gtk/2.24/GtkWidget.html <- ale tutaj nie bylo :P zresztą nie czuje różnicy ;)

  1. czemu jako callback do buttona zaloguj wybrałeś delete_event, a do anuluj NULL? chyba chcesz obsługiwać kliknięcie zaloguj, a kliknięcie anuluj powinno tylko zniszczyć okno?

To tylko próbne wywołania. Za pomocą zaloguj wywoływałem chwilowo dowolna funkcję aby zwyczajnie coś się działo. W przypadku anuluj próbowałem zrobić cokolwiek aby zadziałało wyłączenie okna bez destrukcji okna nadrzędnego. To była jedna z ostatnich prób i zwyczajnie taki kod wkleiłem tutaj :).

Problem z pozyskaniem tekstu chyba rozwiązany. Sprawdzę za jakiś czas jak mi się system zaktualizuje bo chwilowo IDE przez to nie widzi mi kompilatora.


EDYTKA:
Ok problem z pobieraniem tekstu rozwiązany. Poniżej jest poprawiony kod.

//struktura

struct LogPas{
    GtkWidget *login;
    GtkWidget *password;
};
typedef struct LogPas wskLog;

//tutaj pobieram dane i wrzucam je do struktury a nastpenie przekazuje strukturę jako parametr funkcji zwrotnej
    //kontrolki w oknie
   wskLog *iLog;
   iLog=new wskLog;
    label=gtk_label_new("Login");
    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
    iLog->login=gtk_entry_new_with_max_length(16);
    gtk_table_attach_defaults(GTK_TABLE(table),iLog->login,1,3,0,1);

    label=gtk_label_new("Hasło");
    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
    iLog->password=gtk_entry_new_with_max_length(32);
    gtk_table_attach_defaults(GTK_TABLE(table),iLog->password,1,3,1,2);

    button=gtk_button_new_with_label("Zaloguj");
    gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,2,3);
    gtk_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK (ConnectWithSerwer),iLog);

//a oto funkcja ConnectWithSerwer


void WindowC::ConnectWithSerwer(GtkWidget *widget, wskLog *log)
{
    const char *login=gtk_entry_get_text(GTK_ENTRY(log->login));
    const char *password=gtk_entry_get_text(GTK_ENTRY(log->password));
    g_print("%s\n%s\n", login, password);
}
0

Wszystkie problemy rozwiązane.

Aby menu działało trzeba w kodzie

        g_signal_connect(GTK_OBJECT(elmenu),"button_press_event", G_CALLBACK(functodo), (gpointer)pWindow);

zmienić button_press_event na activate

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1