ubuntuusers.de

Gtk Programmieren - Einsteigerprobleme

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Avantarius

Avatar von Avantarius

Anmeldungsdatum:
20. April 2009

Beiträge: 69

Hallo Leute,

Habe gerade mit Gtk Programmierung begonnen und damit ich alles einigermaßen verstehe arbeite ich zunächst mal ohne IDE und ohne Glade. Bin leider sofort auf ein Problem gestoßen als ich eine simple GUI zusammenbasteln wollte - es gelingt mir nicht, ein Eingabefeld in eine Toolbar einzufügen (ähnlich wie zB bei Firefox). Habe sowohl gtk_toolbar_insert als auch gtk_box_pack_start versucht, aber ohne Erfolg. Kann mir vielleicht jemand weiterhelfen, was mache ich hier falsch?

#include <gtk/gtk.h>

int main( int argc, char *argv[]) {
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *toolbar;
  GtkToolItem *back;
  GtkToolItem *forward;
  GtkWidget *entry;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Test");
  gtk_window_set_default_size(GTK_WINDOW(window), 600, 400);

  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  toolbar = gtk_toolbar_new();

  gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);

  back = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), back, -1);
  forward = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), forward, -1);
  
  entry = gtk_entry_new();
	gtk_box_pack_start(GTK_BOX(toolbar), entry, FALSE, FALSE, 2);

  gtk_widget_show_all(window);

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

  gtk_main();

  return 0;
}

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Du hast dich nach der Erzeugung von entry vertan: Als erstes Argument von gtk_box_pack_start() steht bei dir GTK_BOX(toolbar), es sollte aber GTK_BOX(vbox) heißen. Das behebt dann auch die Gtk-Meldung in der Konsole. 😉

Avantarius

(Themenstarter)
Avatar von Avantarius

Anmeldungsdatum:
20. April 2009

Beiträge: 69

snafu1 schrieb:

... steht bei dir GTK_BOX(toolbar), es sollte aber GTK_BOX(vbox) heißen.

Dass es dann funktioniert ist mir schon klar, aber vielleicht habe ich mich etwas unklar ausgedrückt. Wenn ich es so mache, habe ich nämlich eine Toolbar mir zwei Buttons und darunter ein Eingabefeld. Was ich aber möchte ist ein Eingabefeld rechts neben den zwei Buttons, also im Toolbar drin.

Irgendwelche Ideen dazu?

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Ich hab mir mal erlaubt, mit der Lösung auch deinen Code etwas anders zu strukturieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <gtk/gtk.h>

int main (int argc, char *argv[])
{
    GtkWidget *window, *design, *toolbar, *entry;
    GtkToolItem *back, *forward, *entry_field;

    gtk_init (&argc, &argv);

    // create widgets
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    design = gtk_vbox_new (FALSE, 0);
    toolbar = gtk_toolbar_new ();
    back = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
    forward = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
    entry = gtk_entry_new ();
    entry_field = gtk_tool_item_new ();

    // prepare entry field
    gtk_tool_item_set_expand (entry_field, TRUE);
    gtk_container_add (GTK_CONTAINER (entry_field), entry);

    // put buttons and entry field into toolbar
    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), back, -1);
    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), forward, -1);
    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), entry_field, -1);

    // place toolbar into design and design into window
    gtk_box_pack_start (GTK_BOX (design), toolbar, FALSE, FALSE, 0);
    gtk_container_add (GTK_CONTAINER (window), design);

    // set window properties
    gtk_window_set_title (GTK_WINDOW (window), "Test");
    gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);

    // connect signals
    g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);

    // show the result
    gtk_widget_show_all (window);
    gtk_main ();

    return 0;
}

Avantarius

(Themenstarter)
Avatar von Avantarius

Anmeldungsdatum:
20. April 2009

Beiträge: 69

Was ich nicht verstehe ist warum man es sich hier dermaßen kompliziert macht, schließlich ist eine Toolbar im Prinzip auch nur eine hbox mit speziellem Design...

Aber auf jeden Fall funktionierts so, wieder was dazugelernt 😉

Vielen Dank!

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Verstehe ich auch nicht. Für jeden Mist hat man GtkWidgets, die man casten muss, um an irgendwelche Informationen zu kommen oder spezielle Dinge mit ihnen zu machen, aber die Toobar will plötzlich ganz besondere GtkToolItems, die häufig wirklich nur Proforma erstellt werden müssen. IMHO würde es reichen, eine Funktion a la widget_to_toolitem() zu haben, der man das "Expandverhalten" als Argument mitgeben könnte. Scheint es aber wirklich nicht zu geben. Vermutlich wird es aber irgendwelche guten Gründe dafür geben, warum das so ist... 😉

Avantarius

(Themenstarter)
Avatar von Avantarius

Anmeldungsdatum:
20. April 2009

Beiträge: 69

Überhaupt werden einem die einfachsten Sachen da ziemlich kompliziert gemacht und in unnötig viele Einzelschritte zerlegt. Und mit Glade, GtkBuilder zu arbeiten hilft auch nichts weil man dann nichts mehr über den Gtk-Aufbau lernt ☹

Avantarius

(Themenstarter)
Avatar von Avantarius

Anmeldungsdatum:
20. April 2009

Beiträge: 69

Muss leider nochmal ne blöde Frage stellen:

Habe einen TreeView mit TreeStore, nur eine Spalte in die ein Pixbuf und ein Text gerendert werden. Das Hinzufügen von items mit

gtk_tree_store_set(treestore, &iter, 0, pic, 1, _("Some Text"), -1);

funktioniert perfekt wenn ich als pic einen GdkPixbuf übergebe.

Jetzt die blöde Frage: Wie kann ich als pic ein GTK stock icon verwenden? Und jetzt noch eine blödere Frage: Wie kann ich als pic ein Gnome stock icon verwenden?

Bitte um Hilfe falls das jemand weiß!

YEPHENAS

Anmeldungsdatum:
8. Juni 2009

Beiträge: 352

Avantarius schrieb:

Muss leider nochmal ne blöde Frage stellen:

Habe einen TreeView mit TreeStore, nur eine Spalte in die ein Pixbuf und ein Text gerendert werden. Das Hinzufügen von items mit

gtk_tree_store_set(treestore, &iter, 0, pic, 1, _("Some Text"), -1);

funktioniert perfekt wenn ich als pic einen GdkPixbuf übergebe.

Jetzt die blöde Frage: Wie kann ich als pic ein GTK stock icon verwenden? Und jetzt noch eine blödere Frage: Wie kann ich als pic ein Gnome stock icon verwenden?

Bitte um Hilfe falls das jemand weiß!

Ich würde es mit den beiden Funktionen probieren:

gtk_icon_theme_get_default ()

gtk_icon_theme_load_icon ()

Avantarius

(Themenstarter)
Avatar von Avantarius

Anmeldungsdatum:
20. April 2009

Beiträge: 69

Funktioniert perfekt, danke! ☺

Man muss als icon_name einfach nur den Dateinamen des Icon-Files angeben schon geht's! Manchmal ist es wirklich so einfach dass man (fast) nicht draufkommt!

Antworten |