2016-04-19 12 views
1

zu erhalten Ich lerne die Grundlagen von GTK für ein Schulprojekt und ich versuche, ein Basisprogramm zu erstellen, das den Wert eines Texteintrags druckt, wie es geändert wird. Während ich eine Ausgabe irgendeiner Art immer bin, ist es ein kritischer Fehler, der sagt:Schwerer Fehler beim Versuch, Textwert von GTKEntry

Gtk-CRITICAL **: gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed 
The text is : (null) 

Mein Code ist wie folgt:

#include<gtk/gtk.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "salesbase.h" 
#include <sqlite3.h> 
#include <unistd.h> 

static void change_text(GtkWidget *widget, GtkEntry *data){ 
    const char* output = gtk_entry_get_text(data); 
    printf("The text is : %s\n", output); 
} 

int main(int argc, char *argv[]){ 
    GtkBuilder *builder; 
    gtk_init(&argc, &argv); 
    GObject *window; 
    GtkEntry *input; 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file(builder, "ui/main.ui", NULL); 

    window = gtk_builder_get_object(builder, "mainwindow"); 
    g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    input = GTK_ENTRY(gtk_builder_get_object(builder, "test_entry")); 
    g_signal_connect(input, "changed", G_CALLBACK(change_text), &input); 



    gtk_main(); 

    return 0; 
} 
+1

"& input" nicht an 'g_signal_connect()' übergeben; 'input' ist bereits ein Zeiger und somit ist' & input' tatsächlich ein Zeiger auf eine lokale Variable, die Sie nicht als Objekt verwenden wollen. Übergeben Sie stattdessen nur "Eingabe". – andlabs

Antwort

2

Viertes Argument g_signal_connect ist gpointer, die Alias ​​void * ist So ist es schon ein Zeiger. input ist ein Zeiger, also wenn Sie es übergeben möchten, können Sie es direkt übergeben:

g_signal_connect(input, "changed", G_CALLBACK(change_text), input); 

Passing &input zwei Probleme: es geht Zeiger auf Zeiger (GtkEntry**) Zeiger erwartet funktionieren (GtkEntry*), was scheitert; und input ist eine lokale Variable, so dass Sie den Zeiger auf die lokale Variable speichern, die außerhalb des Gültigkeitsbereichs liegt (in diesem Beispiel ist das kein Problem, da input die Hauptschleife überlebt).

Doch wie Sie Ihr Signal an input, Empfänger dieses Signals eine Verbindung ist standardmäßig als erstes Argument von Callback übergeben, so müssen Sie es um nicht tragen zu tragen, so dass Sie Ihren Code vereinfachen:

g_signal_connect(input, "changed", G_CALLBACK(change_text), NULL); 
... 
static void change_text(GtkWidget *widget, gpointer data){ 
    const char* output = gtk_entry_get_text(GTK_ENTRY(widget)); 
    printf("The text is : %s\n", output); 
} 
+0

Danke, das erklärt auch mehr über GTK im Allgemeinen – bsizzle

Verwandte Themen