2009-12-23 1 views
2

Я хотел бы иметь панель состояния, поэтому я начал с создания небольшой программы с только статусом, чтобы я мог видеть, как это работает.Как работает панель состояния GTK? Что случилось с моим кодом?

Прямо сейчас, я просто хотел бы получить некоторый текст в нем, но вместо этого отображает случайный символ.

Может кто-нибудь увидеть, что не так с моим кодом?

#include <gtk/gtk.h> 

int main (int argc, char *argv[]) { 
    GtkWidget *window, *statusbar, *vbox; 
    gchar *info; 
    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_set_size_request(window, 250, -1); 

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); 

    statusbar = gtk_statusbar_new(); 

    /* stack for info messages */ 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) "1"); 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) "2"); 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) "3"); 

    /* stack for warning messages */ 
    g_object_set_data(G_OBJECT(statusbar), "warning", (gpointer) "A"); 
    g_object_set_data(G_OBJECT(statusbar), "warning", (gpointer) "B"); 
    g_object_set_data(G_OBJECT(statusbar), "warning", (gpointer) "C"); 

    /* get id for the message at the top of the info stack? */ 
    guint id = gtk_statusbar_get_context_id(statusbar, "info"); 
    /* show the top message from the info stack ? */ 
    gtk_statusbar_push(statusbar, id, info); 

    vbox = gtk_vbox_new(FALSE, 5); 
    gtk_box_pack_start_defaults(GTK_BOX (vbox), statusbar); 
    gtk_container_add(GTK_CONTAINER(window), vbox); 

    gtk_widget_show_all(window); 
    gtk_main(); 
    return 0; 
} 

Я получаю эти предупреждения

s.c:26: warning: passing argument 1 of ‘gtk_statusbar_get_context_id’ from incompatible pointer type 
/usr/include/gtk-2.0/gtk/gtkstatusbar.h:94: note: expected ‘struct GtkStatusbar *’ but argument is of type ‘struct GtkWidget *’ 
s.c:28: warning: passing argument 1 of ‘gtk_statusbar_pop’ from incompatible pointer type 
/usr/include/gtk-2.0/gtk/gtkstatusbar.h:100: note: expected ‘struct GtkStatusbar *’ but argument is of type ‘struct GtkWidget *’ 
s.c:28: error: too many arguments to function ‘gtk_statusbar_pop’ 
+1

не из этого кода у вас нет - в нем нет 'gtk_statusbar_pop'! –

ответ

4

Вы объявили GtkWidget *statusbar но gtk_statusbar_... методы ожидают GtkStatusbar *: литье его GTK_STATUSBAR(statusbar) удаляет предупреждения. Это не большая проблема, так как программа будет работать в любом случае: самая большая проблема заключается в том, что вы используете info без ее инициализации.

Следующий код работает, как ожидается, здесь:

/* gcc -o status status.c $(pkg-config --cflags --libs gtk+-2.0) */ 

#include <gtk/gtk.h> 

int main (int argc, char *argv[]) { 
    GtkWidget *window, *statusbar, *vbox; 
    gchar *info; 
    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_set_size_request(window, 250, -1); 

    g_signal_connect(G_OBJECT(window), "destroy", 
        G_CALLBACK(gtk_main_quit), NULL); 

    statusbar = gtk_statusbar_new(); 

    /* stack for info messages */ 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) 
         "1"); 
    g_object_set_data(G_OBJECT(statusbar), "info", 
         (gpointer) "2"); 
    g_object_set_data(G_OBJECT(statusbar), "info", 
         (gpointer) "3"); 

    /* stack for warning messages */ 
    g_object_set_data(G_OBJECT(statusbar), "warning", 
         (gpointer) "A"); 
    g_object_set_data(G_OBJECT(statusbar), "warning", 
         (gpointer) "B"); 
    g_object_set_data(G_OBJECT(statusbar), 
         "warning", (gpointer) "C"); 

    /* get id for the message at the top of the 
    * info stack? */ 
    guint id = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "info"); 
    /* show the top message from the info stack 
    * ? */ 
    info = "This was uninitialized"; 
    gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, info); 

    vbox = gtk_vbox_new(FALSE, 5); 
    gtk_box_pack_start_defaults(GTK_BOX 
           (vbox), 
           statusbar); 
    gtk_container_add(GTK_CONTAINER(window), 
         vbox); 

    gtk_widget_show_all(window); 
    gtk_main(); 
    return 0; 
} 

Я не знаю, что вы пытаетесь достичь с g_object_set_data, хотя, но, возможно, они являются только старые тесты ...

Приложение:

Вы должны использовать gtk_statusbar_push(), чтобы накапливать сообщения в стек строки состояния. С gtk_statusbar_pop() вы удалите последнее нажатое сообщение, открыв предыдущее.

gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, "First message"); 
// Now the statusbar shows "First message" 
gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, "Second message"); 
// Now the statusbar shows "Second message" 
gtk_statusbar_pop(GTK_STATUSBAR(statusbar), id); 
// Now the statusbar shows "First message" 
+0

Прохладный! Большое спасибо. Итак, давайте теперь скажем, что я хочу, чтобы в строке состояния отображалось предупреждающее сообщение 2. Как это сделать? Я не могу понять, как работает эта концепция push/pop. – Louise

+1

Добавлен пример в ответ. – ntd

+0

Ничего себе. Огромное спасибо. Ты действительно знаешь свои вещи! – Louise

Смежные вопросы