2012-02-16 9 views
4

私はテンキーパッドとボタンをクリックするとテキストボックスを持つアプリケーションを開発しています。テキストボックスにはその番号が表示されます。 各ボタンに機能を書き込む必要がありますか?または、パラメータとしてテキストとウィジェットを渡すことができますか?私は考えることができることをGTKでボタンのテキストを取得する方法は?

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

void callback(GtkWidget *widget, 
       gpointer data) 
{ 
    gtk_entry_append_text(entry, text); 
} 

void create_button(GtkWidget* table,GtkWidget* entry, 
        int start_r,int end_r, 
        int start_c,int end_c, 
        char* label) 
{ 
    GtkWidget *button; 

    button = gtk_button_new_with_label (label); 
    g_object_set_data(G_OBJECT(button), 
          "char", (gpointer)label); 
    g_signal_connect (button, "clicked", 
       G_CALLBACK (callback), entry); 

    gtk_table_attach_defaults (GTK_TABLE(table), button, start_c, end_c, start_r, end_r); 

    gtk_widget_show (button); 

} 

gint delete_event(GtkWidget *widget, 
        GdkEvent *event, 
        gpointer data) 
{ 
    gtk_main_quit(); 
    return(FALSE); 
} 

int main(int argc,char* argv[]){ 

    GtkWidget *window; 
    //GtkWidget *button; 
    GtkWidget *table; 
    GtkWidget *entry; 
    //GtkWidget *label; 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW (window), "Armario"); 
    g_signal_connect (GTK_OBJECT (window), "delete_event", 
         G_CALLBACK (delete_event), NULL); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 20); 

    table = gtk_table_new (2, 2, TRUE); 
    gtk_container_add (GTK_CONTAINER (window), table); 

    entry = gtk_entry_new(); 
    gtk_entry_set_max_length(GTK_ENTRY(entry),10); 
    gtk_entry_set_placeholder_text(GTK_ENTRY(entry),"Teste"); 
    gtk_table_attach_defaults (GTK_TABLE(table), entry, 0, 2, 1, 2); 
    gtk_widget_show(entry); 

    create_button(table,entry,0,1,0,1,"Botao"); 

    gtk_widget_show (table); 
    gtk_widget_show (window); 

    gtk_main(); 

    return 0; 
} 

答えて

8

あなたの質問への答えはあなた、イエスでありますGtk +のウィジェットをコールバックに渡すことができます。実際には、clickedシグナルのコールバックの最初のパラメータは、シグナルを受信したボタン(通常はクリックされたボタン)です。下のサンプルコードでわかるように、ボタンからラベルを抽出してテキストとして使用できます。

[...] /* In create_button... */ 
/* Make your buttons be notified when they are clicked */ 
g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), entry); 
[...] 

/* Append the text in the button to the text entry */ 
void on_button_clicked (GtkButton *button, gpointer user_data) 
{ 
    GtkEntry *entry = user_data; 
    const gchar *text = gtk_button_get_label (button); 
    gint position = 0; 
    gtk_editable_insert_text (GTK_EDITABLE (entry), text, -1, &position); 
} 

gtk_entry_append_textが長い間廃止されましたので、私はgtk_editable_insert_textを使用しています。 "entry"パラメータをコールバックに渡すことは、最後のパラメータg_signal_connectを使用することで可能になります。これにより、コールバックでアクセスする必要のあるデータを指定できます。この情報は、「user_data」パラメータでコールバックが利用できるようになります。

あなたexempleもgtk_widget_show_allを使用することによって改善することができ、テキストはすでに(gtk_button_get_labelで検索された)labelプロパティに設定されているように私はまた、「CHAR」プロパティにg_object_set_dataを呼び出すことでポイントが表示されていません。

1

つのオプション、:あなたがそれらへのデータの任意の部分を添付することができるように

  1. GTKウィジェットは、本当にGObjectsです。機能g_object_set_data/g_object_set_data_full/g_object_get_dataを参照してください。したがって、ボタンにテキストを添付データとして追加し、必要なときにそれを取得することができます。

  2. すべてのフィールドを含む構造体を定義し、それにポインタを渡すことで、コールバックに必要なデータを渡すことができます。構造体を静的に宣言することができない場合は、mallocことができ、それとデータを解放する関数を指定するg_signal_connect_dataを使用します。たとえば

を:

struct entry_and_text; 
{ 
    GtkWidget *w; 
    char *text; 
}; 
void free_data(gpointer data, GClosure *closure) 
{ 
    free(data); 
} 

entry_and_text *data = (entry_and_text *)malloc(sizeof(entry_and_text)); 
data->w = entry; 
data->text = label; 
g_signal_connect_data (button, "clicked", 
      G_CALLBACK (callback), data, free_data, 0); 
+0

しばらくして、私は考えを持っていました。 gtk_entry_get_label関数でボタンのラベルを使用し、引数としてエントリを使用することを思い出しましたが、私はオプションが好きです。 –

関連する問題