2016-04-19 70 views
1

私は学校プロジェクトのGTKの基礎を学んでおり、変更されたテキストエントリの値を出力する基本的なプログラムを作成しようとしています。GTKEntryのテキスト値を取得しようとすると重大なエラーが発生する

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

を次のように私のコードは次のとおりです:g_signal_connect

#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

第四引数はvoid *の別名である、gpointerである私はいくつかの種類の出力を取得していながら、それは言う重大なエラーです、それはすでにポインタです。あなたはそれを渡したい場合は、あなたがそれを直接渡すことができるようにinputは、ポインタである:&inputを渡す

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

には2つの問題がある:それはポインタ(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

関連する問題