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
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)
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
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)
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
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Verstehe ich auch nicht. Für jeden Mist hat man GtkWidget s, 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 GtkToolItem s, 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)
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)
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)
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!
|