2016-04-19 4 views
1

Я изучаю основы GTK для школьного проекта, и я пытаюсь создать базовую программу, которая печатает значение текстовой записи по мере ее изменения. В то время как я получаю выход какой-то, это критическая ошибка, которая говорит:Критическая ошибка при попытке получить текстовое значение GTKEntry

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

Мой код выглядит следующим образом:

#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' в' g_signal_connect() '; 'input' уже является указателем, и поэтому' & input' на самом деле является указателем на локальную переменную, которую вы не хотите использовать в качестве самого объекта. Вместо этого передайте только 'input'. – andlabs

ответ

2

Четвертый аргумент g_signal_connect является gpointer, который является псевдонимом void * , так что это уже указатель. input является указателем, так что если вы хотите, чтобы передать его, вы можете передать его непосредственно:

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

Передача &input есть две проблемы: он передает указатель на указатель (GtkEntry**) функционировать ожидая указателя (GtkEntry*), что не удается; и input - это локальная переменная, поэтому вы сохраняете указатель на локальную переменную, которая может выйти из области видимости (в этом примере это не проблема, так как input переживает основной цикл).

Однако, как вы подключите сигнал input, приемник этого сигнала по умолчанию передается в качестве первого аргумента функции обратного вызова, так что вам не придется носить носить его, так что вы можете упростить ваш код:

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

Спасибо, это объясняет больше вещей о GTK вообще – bsizzle

Смежные вопросы