PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [GTK/C] Eingabefeld



nul
11-08-2003, 16:28
:) :( :) Seit langen wieder einmal ein Post von mir!!!
Taste mich so langsam an GTK+ heran und schreibe jetzt ein Programm, das die Aufgabe hat, Text einzulesen und den in einer bestimmten char-Variable zu speichern.

Mit GTK hab ich jetzt mal ein Fenster erzeugt, das meinen anforderungen gerecht wird, und schon wies ich nicht weiter.....

Könnt ihr mir helfen, wisst ihr beispielsweise eine solche Funktion, um ein solches Problem (zumindest für mich) zu lösen? Der Cursor sollte dabei schon im Eingabefeld enthalten sein!!!

mfg nul

cybercrow
11-08-2003, 17:26
Meinst du ein entry Feld?
dazu habe ich mal ein kleines Programm zum lernen geschrieben, vielleicht hilft es dir weiter...



#include <gtk/gtk.h>

gint delete_event(GtkWidget *widget, GdkEvent event, gpointer daten)
{
return FALSE;
}

void ende(GtkWidget *widget, gpointer daten)
{
gtk_main_quit();
}

void enter_callback( GtkWidget *entry)
{

const gchar *entry_text;

entry_text = gtk_entry_get_text(GTK_ENTRY(entry));
printf ("Entry contents: %s\n", entry_text);
}


int main(int argc, char **argv)
{

GtkWindow *fenster;
GtkWidget *entry;

gtk_init(&argc, &argv);

fenster = g_object_new(GTK_TYPE_WINDOW,
"default-height", 100,
"default-width", 200,
NULL);

g_signal_connect(fenster,
"delete_event",
G_CALLBACK(delete_event),
NULL);
g_signal_connect(fenster,
"destroy",
G_CALLBACK(ende),
NULL);

entry = g_object_new(GTK_TYPE_ENTRY,
"max-length", 50,
NULL);
g_signal_connect(entry,
"activate",
G_CALLBACK(enter_callback),
NULL);

gtk_container_add(GTK_CONTAINER(fenster),
GTK_WIDGET(entry));
gtk_widget_show_all(GTK_WIDGET(fenster));

gtk_main();

return 0;
}


Das event activate wird ausgelöst, wenn man im entry-Feld enter drückt.

das einzige was ich bisher noch nicht so richtig verstanden haben ist, warum die Variable für den Text als 'const' deklariert werden muß. Aber vielleicht kann das ja noch jemand erklären...

nul
11-08-2003, 18:35
Ich werds gleich mal ausprobieren, danke schon mal im voraus!!! :)

nul
12-08-2003, 09:44
OK, weit bin ich nicht gekommen. Meiner Meinung nach müsste folgender Code genügen:



#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

void enter_callback( GtkWidget *widget,
GtkWidget *entry )
{
const gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (entry));
printf("Entry contents: %s\n", entry_text);
}

int main( int argc,
char *argv[] )
{

GtkWidget *window;
GtkWidget *vbox;
GtkWidget *entry;

gtk_init (&argc, &argv);

/* create a new window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize(GTK_WIDGET (window), 200, 100);
gtk_window_set_title (GTK_WINDOW (window), "GTK Entry");

entry = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (entry), 50);
g_signal_connect(G_OBJECT(entry), "activate",
G_CALLBACK(enter_callback),
(gpointer) entry);

gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
gtk_widget_show (entry);

gtk_widget_show (window);

gtk_main();

return 0;
}


Die ganzen Header-Dateien nur für die spätere Bearbeitung, aber an dem kann es ja nicht liegen, denn ich erhalte ff. Fehlermeldung beim compilieren mit

gcc -Wall -ggdb `gtk-config --libs --cflags` prog.c -o prog




prog.c: In function `main':
prog.c:30: warning: implicit declaration of function `g_signal_connect'
prog.c:30: warning: implicit declaration of function `G_OBJECT'
prog.c:30: warning: implicit declaration of function `G_CALLBACK'
/tmp/ccfRsuEZ.o: In function `main':
/home/xx/prog.c:30: undefined reference to `G_CALLBACK'
/home/xx/prog.c:30: undefined reference to `G_OBJECT'
/home/xx/prog.c:30: undefined reference to `g_signal_connect'
collect2: ld returned 1 exit status


Ich hab das dann öfter versucht, aber ich komme mit den Funktionen g_signal_connect, G_OBJECT und G_CALLBACK nicht klar!

cybercrow
12-08-2003, 10:04
Also bei mir compiliert dein Programm!

Was ich aber nicht verstehe ist warum du beim signal "activate" das widget und dann noch zusätzlich einen pointer auf das entry widget mitgibst, da beides die gleichen widgets sind das Signal geht ja schon von entry widget aus!

Auf jedenfall compiliert es bei mir mit diesem Befehl:

gcc -o prog prog.c `pkg-config gtk+-2.0 --cflags --libs`

nul
12-08-2003, 16:05
OK, jetzt hab ichs, fast, das Prog lässt sich kompilieren, beim Aufrufen kommt aber die Warnung "Segmention fault"????
Was bedeutet das denn nun schon wieder?
Hast du es versucht auszuführen? Funktioniert es bei dir und wenn ja, hast du eine Ahnung warum?

P.S. Wenns nicht zu viel aufwand ist, kannst du mir erklären was ich da falsch gemacht habe mit den pointer? Wie kann ich das ausbessern was du meinst?

tschuldigung, großer Anfänger/Neuling/Frischling/....