Как работает GTK Statusbar? Что не так с моим кодом? - PullRequest
3 голосов
/ 23 декабря 2009

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

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

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

#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 Ответ

4 голосов
/ 23 декабря 2009

Вы объявили 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...