[C und GTK+ 2] fenster durch buttons schließen?!

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
philonous
Beiträge: 102
Registriert: 20.12.2005 10:07:44
Wohnort: /home/stefan
Kontaktdaten:

[C und GTK+ 2] fenster durch buttons schließen?!

Beitrag von philonous » 01.04.2006 12:26:15

hallo liebe debianforumianer..!

ich hab jetzt mal versucht, etwas mit gtk zu spielen. als "testprogramm" hab ich mir n kleinen palindrom-check zurechtgelegt - dazu will ich eine kleine GUI basteln, wo man das zu testende wort eingeben kann... ja. sehr rudimentär. aber man muss ja klein anfangen :)

das hauptfenster ist auch kein problem (einfach n eingabefeld und ein button mit der beschriftung "check"). wenn man auf den check-button klickt, soll ein dialog aufploppen, in dem das ergebnis des tests bekannt gegeben wird (zb "ja, das is eins"). dieses dialog-fenster soll nur einen ok-button enthalten, der, wenn man ihn klickt, das dialogfenster schließt. zuerst dachte ich, das könnte ich mit "gtk_widget_destroy" lösen. dabei ergibt sich aber ein verdammt unschönes bild, denn da wird NUR der ok-button gelöscht... ;) also wirklich nicht das, was ich will, hehe

mit etwas - wie ich finde - trickserei funktionierts. aber ich bin mir nicht sicher, ob das wirklich "der saubere weg" ist.

ganz kurz also die erklärung wie ichs gelöst hab:
ich verbinde den button mit einem signal. klar. damit wird die funktion "destroy_window" aufgerufen...

Code: Alles auswählen

    // jetzt den ok button connecten
    gtk_signal_connect((gpointer)okbutton, "clicked", G_CALLBACK(destroy_window), dialog);
und zwar bekommt sie als zweiten übergabeparameter den pointer auf das dialogfenster mit, in dem sich der ok-button befindet.

die entsprechende funktion sieht dann so aus:

Code: Alles auswählen

static void destroy_window(GtkWidget* widget, gpointer* pointer)
{
    gtk_widget_destroy((GtkWidget*) pointer);
}
hm. also der compiler hat nicht gemeckert... syntaktisch is es ja korrekt. aber ich weiß nicht recht, ob das wirklich eine gute lösung ist..?!

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 01.04.2006 14:38:53

Hallo,
prinzipiell kannst du das so machen, etwas schöner ist es vielleicht, wenn du das destroy signal direkt an das Fenster weiterleitest:

Code: Alles auswählen

g_signal_connect_swapped(okbutton, 
                                            "clicked",
                                            G_CALLBACK(gtk_widget_destroy),
                                            dialog);
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
dopehouse
Beiträge: 452
Registriert: 01.09.2005 12:02:16
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Hildesheim (Niedersachsen)
Kontaktdaten:

Beitrag von dopehouse » 01.04.2006 14:43:54

Probier es doch mal mit gtk_widget_hide(dialog). Allerdings solltest du dann auch darauf achten, dass du den Dialog nicht zweimal Erstellst und so Speicherleichen hinterläst. Also beim Programmstart schon den Dialog aufbauen aber noch nicht mit gtk_widget_show(dialog) anzeigen, sondern erst, wenn das Ergebnis angezeigt werden soll. Wenn du dann auf OK im Dialog klickst, solltest du nur gtk_widget_hide(dialog) aufrufen, um den Dialog wieder zu verstecken.

Benutzeravatar
philonous
Beiträge: 102
Registriert: 20.12.2005 10:07:44
Wohnort: /home/stefan
Kontaktdaten:

...

Beitrag von philonous » 01.04.2006 15:24:44

ja sehr genial! sehr vielen dank euch beiden..!

@BeS: das is natürlich eine wesentlich elegantere lösung, weil ich mir so den zwischenschritt mit der eigenen funktion spare...

@dopehose: an das hatt ich überhaupt gar nicht gedacht... auch eine gute idee :) thx!

Antworten