GTK image

 ( nzmark | 2005. december 24., szombat - 1:51 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

újabb kérdésem lenne:
GtkComboBox -nál hogyan lehet az összes elemét törölni, hogy üres legyen?

GTK -ban szeretnék programot írni. nem ez az első, szóval jónéhány dologgal tisztában vagyok. a programban azt szeretném elérni, hogy egy gomb lenyomásakor az ablakban a kép megváltozzon. Tehát van egy ablak amit felosztottam mondjuk vertical box-szal 3részre. alul lenne a gomb középen meg a kép ami változik, fölül meg valami label. engem nem az event érdekel, hanem maga az, hogy a képet hogyan cserélem a vbox-ban. tudna ebben valaki segíteni? nézegettem a gtk_image_new_from_file fügvényt, persze lehet nem is ez kell.

[quote:646254bbba="nzmark"]újabb kérdésem lenne:
GtkComboBox -nál hogyan lehet az összes elemét törölni, hogy üres legyen?[/quote:646254bbba]

Ha gtk_combo_box_new_text() -el hoztad letre:

[code:1:646254bbba]
static gboolean
on_remove_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GtkComboBox *combo;
GtkTreeModel *model;
gint count;
gint i;

combo = (GtkComboBox*) data;

model = gtk_combo_box_get_model (combo);
count = gtk_tree_model_iter_n_children (model, NULL);

gtk_combo_box_set_active (combo, -1);

for (i = count - 1; i >= 0; i--) {
gtk_combo_box_remove_text (combo, i);
}

return TRUE;
}
[/code:1:646254bbba]

ha osszetettebb a combobox akkor, gtk_combo_box_set_model() fuggvenyt nezd meg.

[quote:0394edd0d8="nzmark"]GTK -ban szeretnék programot írni. nem ez az első, szóval jónéhány dologgal tisztában vagyok. a programban azt szeretném elérni, hogy egy gomb lenyomásakor az ablakban a kép megváltozzon. Tehát van egy ablak amit felosztottam mondjuk vertical box-szal 3részre. alul lenne a gomb középen meg a kép ami változik, fölül meg valami label. engem nem az event érdekel, hanem maga az, hogy a képet hogyan cserélem a vbox-ban. tudna ebben valaki segíteni? nézegettem a gtk_image_new_from_file fügvényt, persze lehet nem is ez kell.[/quote:0394edd0d8]

jo a gtk_image_new_from_file(...)
modositani meg gtk_image_set_from_file(...)

Ha filet nem talalja akkor a nincs kep stock ikont kapod vissza. Ha kezelni akarod a fajl megnyitasat akkor:
gdk_pixbuf_new_from_file()
gtk_image_new/set_from_pixbuf()

Ez van a doksiban.

Ja és g_object_unref(G_OBJECT(pixbuf));

vagy egyszeruen, ha GtkTreeModell meg van, akkor:

gtk_list_store_clear (GTK_LIST_STORE (model));

[quote:53c0e60047="SDN"][quote:53c0e60047="nzmark"]újabb kérdésem lenne:
GtkComboBox -nál hogyan lehet az összes elemét törölni, hogy üres legyen?[/quote:53c0e60047]

ha osszetettebb a combobox akkor, gtk_combo_box_set_model() fuggvenyt nezd meg.[/quote:53c0e60047]

na ne má... :-) ezek a GTK fejlesztők mazochisták? ;-)
nézegettem a gtk_combo_box_append_text fügvény implementációját. imígyen fest:
[code:1:53c0e60047]
void
gtk_combo_box_append_text (GtkComboBox *combo_box,
const gchar *text)
{
GtkTreeIter iter;
GtkListStore *store;

g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
g_return_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model));
g_return_if_fail (text != NULL);

store = GTK_LIST_STORE (combo_box->priv->model);

gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, 0, text, -1);
}
[/code:1:53c0e60047]
a végén vannak gtk_list_store.... fügvények, melyek sejtésem szerint a tényleges text appendelést végzik. találtam egy gtk_list_store_clear fügvénytmely leírása szerint: Removes all rows from the list store.
átvettem ezt a kódot és kicsit átírtam, viszonthiába adok a fügvényemnek GtkComboBox -ot, ennél a sornál:
store = GTK_LIST_STORE (combo_box->priv->model);
a fordítás hibával elszáll:
error: dereferencing pointer to incomplete type

[code:1:a0562b6051]
GtkTreeModel *tree_model;
GtkComboBox *combo;

combo = ...;
model = gtk_combo_box_get_model (combo);

gtk_list_store_clear (GTK_LIST_STORE (model));
[/code:1:a0562b6051]

ennyi.

[code:1:4fa73781c0]
#include <gtk/gtk.h>

static gboolean
on_button_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GdkPixbuf *pb;
GtkWidget *image;

image = (GtkWidget*) data;

pb = gdk_pixbuf_new_from_file ("kep2.png", NULL);
gtk_image_set_from_pixbuf (GTK_IMAGE (image), pb);

g_object_unref (pb);

return TRUE;
}

static gboolean
on_remove_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GtkComboBox *combo;
GtkTreeModel *model;

combo = (GtkComboBox*) data;

model = gtk_combo_box_get_model (combo);
gtk_list_store_clear (GTK_LIST_STORE (model));

gtk_combo_box_append_text (combo, "uj item");
gtk_combo_box_set_active (combo, 0);
return TRUE;
}

static void
on_quit ()
{
gtk_main_quit ();
}

int main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *image;
GtkWidget *button;
GtkWidget *combo;
GtkWidget *remove_all;

//GtkWidget *label;
GtkWidget *entry;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

vbox = gtk_vbox_new(FALSE, 0);
image = gtk_image_new_from_file ("kep1.png");
button = gtk_button_new_with_label ("gomb1");
entry = gtk_entry_new ();

combo = gtk_combo_box_new_text ();
remove_all = gtk_button_new_with_label ("remove all...");

gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Hello1");
gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Hello2");
gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Hello3");
gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);

gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), image, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), entry, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), combo, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), remove_all, FALSE, FALSE, 0);

g_signal_connect (button, "button_press_event", G_CALLBACK (on_button_cb), (gpointer) image);
g_signal_connect (remove_all, "button_press_event", G_CALLBACK (on_remove_cb), (gpointer) combo);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (on_quit), NULL);
gtk_widget_show_all (window);

gtk_main ();

return 0;
}
[/code:1:4fa73781c0]

itt a regi kiegeszitve.

oké, köszi ez szuper, no de hogy teszem ki a képet a megfelelő helyre? mondjuk egy 3-as vbox közepére?

esetleg egy működő kódrészletet tudna valaki berakni?
annyi bőven elég lenne, hogy kirak ugyanoda 2képet egymás után. mondjuk van egy frame, berak egy képet, vár 2másodpercet, majd ugyanoda egy másik képet.

[quote:af2a3b12eb="SDN"][code:1:af2a3b12eb]
GtkTreeModel *model;
GtkComboBox *combo;

combo = ...;
model = gtk_combo_box_get_model (combo);

gtk_list_store_clear (GTK_LIST_STORE (model));
[/code:1:af2a3b12eb]

ennyi.[/quote:af2a3b12eb]

s lőn világosság.köszi, szépen működik. akkor legalább jó helyen keresgéltem.

[quote:5887d015c3="nzmark"]oké, köszi ez szuper, no de hogy teszem ki a képet a megfelelő helyre? mondjuk egy 3-as vbox közepére?[/quote:5887d015c3]

a vbox-ba elkezdet rakni a widget-eket.

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

gtk_widget_show (vbox);

----
gtk_box_pack_end() is van.

Ha GtkTable-t hasznalsz, ott van gtk_table_attach(), ennel lehet allitani a pontos helyet a widget-nek.

[code:1:b7d1110d5c]
#include <gtk/gtk.h>

typedef struct window_s {
GtkWindow *window;
GtkEntry *entry;
GtkButton *button_add;
GtkButton *button_change_pixbuf;
GtkButton *button_remove;
GtkImage *image;
GtkComboBox *combo;
gint image_state;
} window_t;

static gboolean
on_button_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GdkPixbuf *pb;
window_t *app_window;
GtkImage *image;

app_window = (window_t*) data;
image = app_window->image;

switch (app_window->image_state) {
case 1:
pb = gdk_pixbuf_new_from_file ("kep2.png", NULL);
app_window->image_state = 2;
break;
case 2:
pb = gdk_pixbuf_new_from_file ("kep1.png", NULL);
app_window->image_state = 1;
break;
default:
/* hiba */
break;
}

gtk_image_set_from_pixbuf (image, pb);
g_object_unref (pb);

return TRUE;
}

static gboolean
on_remove_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GtkComboBox *combo;
GtkTreeModel *model;
window_t *app_window;

app_window = (window_t*) data;
combo = app_window->combo;

model = gtk_combo_box_get_model (combo);
gtk_list_store_clear (GTK_LIST_STORE (model));

return TRUE;
}

static gboolean
on_add_item_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GtkComboBox *combo;
GtkTreeModel *model;
GtkEntry *entry;
window_t *app_window;

app_window = (window_t*) data;
combo = app_window->combo;
entry = app_window->entry;

gtk_combo_box_append_text (combo, gtk_entry_get_text (entry));
gtk_entry_set_text (entry, "");
return TRUE;
}

static void
on_quit ()
{
gtk_main_quit ();
}

int main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *image;
GtkWidget *button_change_pixbuf;
GtkWidget *button_add_item;
GtkWidget *combo;
GtkWidget *button_remove_all;
GtkWidget *entry;

window_t *app_window;

gtk_init (&argc, &argv);

app_window = g_new0(window_t, 1);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

vbox = gtk_vbox_new(FALSE, 0);
image = gtk_image_new_from_file ("kep1.png");
button_change_pixbuf = gtk_button_new_with_label ("gomb1");
entry = gtk_entry_new ();

combo = gtk_combo_box_new_text ();
button_remove_all = gtk_button_new_with_label ("Remove all...");
button_add_item = gtk_button_new_with_label ("Add...");

gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Item 1");
gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Item 2");
gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Item 3");
gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);

gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_box_pack_start (GTK_BOX(vbox), button_change_pixbuf, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), image, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), entry, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), combo, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), button_add_item, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), button_remove_all, FALSE, FALSE, 0);

app_window->window = GTK_WINDOW (window);
app_window->entry = GTK_ENTRY (entry);
app_window->button_add = GTK_BUTTON (button_add_item);
app_window->button_change_pixbuf = GTK_BUTTON (button_change_pixbuf);
app_window->button_remove = GTK_BUTTON (button_remove_all);
app_window->image = GTK_IMAGE (image);
app_window->combo = GTK_COMBO_BOX (combo);
app_window->image_state = 1;

g_signal_connect (button_change_pixbuf, "button_press_event", G_CALLBACK (on_button_cb), (gpointer) app_window);
g_signal_connect (button_remove_all, "button_press_event", G_CALLBACK (on_remove_cb), (gpointer) app_window);
g_signal_connect (button_add_item, "button_press_event", G_CALLBACK (on_add_item_cb), (gpointer) app_window);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (on_quit), NULL);
gtk_widget_show_all (window);

gtk_main ();

return 0;
}
[/code:1:b7d1110d5c]

most itt tartok. :D
remelem segitettem. persze lehetne jobban is, mert nem art a tipusokat ellenorizni mielott csinalunk vele vmit.

Itt egy kod.
[url]http://web.axelero.hu/hrvatska/gtk_sample1.zip[/url]

csomagold ki,
make clean; make
./test

[quote:95c05c3a77="SDN"]Itt egy kod.
[url]http://web.axelero.hu/hrvatska/gtk_sample1.zip[/url]

csomagold ki,
make clean; make
./test[/quote:95c05c3a77]

yeeesssssss.. ez az! millió köszönet, frankón működik és ki is vettem belőle azt a részt ami nekem kell! szuper! mégegyszer köszi a segítségedet, meg mindenki másét is aki segített!

[quote:80c35351c3="SDN"]
most itt tartok. :D
remelem segitettem. persze lehetne jobban is, mert nem art a tipusokat ellenorizni mielott csinalunk vele vmit.[/quote:80c35351c3]

óó, de rendes vagy :-) közben azért már én is megírtam a progit, vagyis már majdnem kész. annyi cifra azért még van benne, hogy a képek elérési útvonalát és hozzájuk tartozó szöveget mysql adatbázisba rakja és onnan is veszi ki, de ezen részt már megcsináltam.

Ha csinálok egy gtk_text_view -et, abból a beleírt szöveget hogyan lehet kiszedni? van egy gtk_text_view_get_buffer ami egy GtkTextBuffer -el tér vissza. aztán van egy másik fügvény ami gtk_text_buffer_get_text és mintha ebből a bufferből szedné ki *char-ba a benne lévő szöveget. jó úton járok? hogyan kell ezt használni? van valami GtkTextIter start és end amit használna a fügvény, de lövésem sincs, hogy az mi lenne.

Oké, stornó! megtaláltam a ...get_start_itert és a ..get_end_iter -t.

az utf8 -ról nem lehet valahogy lebeszélni a gtk-t? nem akarom, hogy a labelek, textviewek és egyáltalán akármik is utf-8 kódolásban legyenek. van erre mód?