2014-09-12 2 views
0

두 개의 텍스트 항목과 버튼이있는 창으로 구성된 코드로 작성된 모델로 양식을 작성해야합니다.GTK 3 하나의 신호를 여러 위젯에 연결하는 방법은 무엇입니까?

항목에 텍스트를 넣고 단추를 누르면 배열의 두 항목에 들어있는 텍스트를 넣거나 (또는 ​​둘 다 인쇄하거나 동시에 두 가지 작업 모두 수행)

창을 만드는 데 사용되는 코드는 다음과 같다 :

#include <iostream> 
#include <gtk/gtk.h> 
using namespace std; 

GtkWidget *wventana; 
GtkWidget *wgrid; 

void ventana(string titulo, int margen) 
{ 
    const char * tituloc = titulo.c_str(); 
    wventana = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
} 

void grid() 
{ 
    wgrid = gtk_grid_new(); 
    gtk_container_add(GTK_CONTAINER(wventana), wgrid); 
} 

void boton(string texto, int x, int y, int lx, int ly) 
{ 
    const char * wtexto = texto.c_str(); 

    GtkWidget *wboton; 
    wboton = gtk_button_new_with_label (wtexto); 
    gtk_grid_attach (GTK_GRID (wgrid), wboton, x, y, lx, ly); 
} 

void entrada(int x, int y, int lx, int ly) 
{ 
    GtkWidget *wentrada; 
    wentrada = gtk_entry_new(); 
    gtk_grid_attach (GTK_GRID (wgrid), wentrada, x, y, lx, ly); 
} 

//INICIO 
int main(int argc, char *argv[]) 
{ 
    gtk_init (&argc, &argv); 

    ventana("ventana",10); 
    grid(); 
    entrada(2, 1, 1, 1); 
    entrada(2, 2, 1, 1); 
    boton("Procesar", 2, 3, 1, 1); 

    gtk_widget_show_all (wventana); 
    gtk_main(); 

    return 0; 
} 

제발이 사람이 할 수있는 방법을 명확히 수 (제공된 코드를 사용할 필요가 없습니다, 유일한 필요한 결과에 대한 참조)

답변

1

이렇게하는 가장 좋은 방법은 구조체를 만드는 것입니다 당신이 신호 처리기에 user_data으로 전달하면 :

typedef struct { 
    GtkWidget *entrada1, *entrada2; 
} Widgets; 

... 

// in main(): 
Widgets *w = g_slice_new0 (Widgets); 
w->entrada1 = entrada (2, 1, 1, 1); // remember to return the widget from entrada()! 
w->entrada2 = entrada (2, 2, 1, 1); 
GtkWidget *procesar = boton ("Procesar", 2, 3, 1, 1); 
g_signal_connect(procesar, "clicked", G_CALLBACK (on_procesar), w); 
// ... 
gtk_main(); 
g_slice_free (Widgets, w); 

... 

void 
on_procesar (GtkButton *procesar, Widgets *w) 
{ 
    // do something with w->entrada1 and w->entrada2 
} 
+0

감사합니다. 다시 ptomato. 제안한 변경 사항을 적용하려고 시도했지만, 초보자부터 entrada()에서 위젯을 반환하는 방법은 없습니다. 제발 어떻게하는지 설명해 주시겠습니까? 그런데 나는 당신을 투표하려했지만, 나는 충분한 평판을 얻지 못했습니다. 하지만 고마워. – Ffff

+0

함수의 마지막에'return wentrada;'를 사용하고'entrada()'의 리턴 타입을'void'에서'GtkWidget *'로 변경하십시오. – ptomato

+0

고마워, 나는 그것을 바꿨다. 그리고 그 부분은 더 이상 poblems을 야기하지 않는다 ... 그러나'GtkWidget * procesar = boton ("Procesar", 2, 3, 1, 1) 행은'오류를 던진다. 무시해야한다 '고 말했다. 왜 이런 일이 발생합니까? PD : GTK에 대해 많이 알고있는 것 같아요, 제가 배울 수있는 가이드에 대해 알고 있습니까? – Ffff

관련 문제