2012-09-04 3 views
-2

gtk 입력 위젯에서 텍스트를 어떻게 가져 와서 그것을 정수 값으로 변환합니까? 내 코드에서 위젯에 대한 포인터를 포함하는 Window라는 래퍼 구조체를 포함합니다. 주에서는 Window의 인스턴스를 선언 한 다음 적절한 GTK 함수 호출을 사용하여 올바른 위젯을 빌드합니다. 그런 다음 해당 윈도우 객체를 클릭 된 액션을 처리하는 함수에 전달합니다. 그런 다음 분모를 정수 형식으로 나눈 분자를 계산하려고합니다. 아래는 나의 시도입니다. 모든 코드는 button_clicked 함수를 제외하고 작동합니다. 어떤 아이디어? 내가 올바르게 표시되는 경우GTK 정수에서 정수로 변환

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

struct Window 
{ 
    GtkWidget *numerator; 
    GtkWidget *denominator; 
    GtkWidget *button; 
    GtkWidget *label; 
}; 


void button_clicked(GtkWidget *widget, gpointer data) 
{ 
    Window* w = (Window*)data; 
    char buf[10]; 

    char buffer[200]; 

    GtkEntry* e = (GtkEntry*)w->numerator; 
    const gchar* entry1 = gtk_entry_get_text(e); 

    char* test = (char*)gchar; 
    int r = atoi(test); 


    sprintf(buf,"%d",r); 

    GtkWidget *label = w->label; 
    gtk_label_set_text(GTK_LABEL(label), buf); 
} 


int main(int argc, char*argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *table; 
    Window w; 


    //Set up my window 
    gtk_init(&argc,&argv); 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window), "Division"); 
    gtk_window_set_default_size(GTK_WINDOW(window),500,500); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 

    //Create my table and add it to the window 
    table = gtk_table_new(4,2,FALSE); 
    gtk_container_add(GTK_CONTAINER(window),table); 

    //Create instances of all my widgets 
    w.numerator = gtk_entry_new(); 
    w.denominator = gtk_entry_new(); 
    w.button = gtk_button_new_with_label("Click"); 
    w.label = gtk_label_new("result"); 

    //Attack the widgets to the table 
    gtk_table_attach(GTK_TABLE(table), w.numerator,0,1,0,1,GTK_FILL,GTK_FILL,5,5); 
    gtk_table_attach(GTK_TABLE(table), w.denominator,0,1,1,2,GTK_FILL,GTK_FILL,5,5); 
    gtk_table_attach(GTK_TABLE(table), w.button,0,1,2,3,GTK_FILL,GTK_FILL,5,5); 
    gtk_table_attach(GTK_TABLE(table), w.label,0,1,3,4,GTK_FILL,GTK_FILL,5,5); 

    //attach the click action to with the button to invoke the button_clicked function 
    g_signal_connect(G_OBJECT(w.button),"clicked",G_CALLBACK(button_clicked),&w); 
     g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); 

    gtk_widget_show_all(window); 


    gtk_main(); 

    return 0; 
} 
+1

"button_clicked 함수를 제외한 모든 코드가 작동합니다."... 어쩌면 당신은 _how_ 작동하지 않는다고 설명 할 수 있습니까? 디버거에서 단계별 실행을 시도 했습니까? –

+0

그건 그렇고, C++을 쓰고 있다면 [gtkmm] (http://www.gtkmm.org/en/) 대신에 가야할까요? – Ancurio

+0

@Ancurio gtkmm을 시작하기위한 좋은 입문서가 있습니까? 모든 올바른 파일을 다운로드 한 줄 알았지 만 gtkmm을 포함 시키려고 할 때 해당 파일이나 디렉토리가 없습니다. – Matthew

답변

4

, 당신의 "테스트 코드"에 당신이하려는 모든 권리, "W-> 분자"의 내용에 레이블 문자열을 설정?

char* test = (char*)gchar; 

나에게 비린내가 보인다 심지어 컴파일되지 않는 라인은 오타 것 같습니다. "gchar"을 "entry1"로 변경하면 원하는대로 할 수 있습니다.

GtkEntry 대신 GtkSpinButton을 사용하는 것이 좋습니다. 그것은 숫자 값을 위해 만들어진 사용자 지정 항목과 같으며 그러한 검색은 여러 번 더 쉽습니다.

+0

죄송합니다, 이것의 전반적인 목표는 실제로 gchar을 char 또는 visa로 변환하지 않고, const gchar *를 정수로 변환하여 – Matthew

+0

@Matthew에서 계산을 수행하는 것입니다. 코드에서 gchar 문자열을 정수로 변환 한 다음 다시 문자열로 ... 그러므로 나는 당신이 무엇을 요구하고 있는지 확신하지 못했습니다. – Ancurio