0

というわけで、ラベルが3枚とエントリーボックスが1枚。私の目標は、入力ボックスに入力して Enter キーを押すたびに、テキストが 3 番目のラベルに表示されるようにすることです。これをもう一度行うと、テキストは 3 番目のラベルに表示され、古いテキストは 2 番目のラベルに移動されます (ラベルには、最後に入力した 3 つのメッセージが表示されます)。

Here is the ChatInfo Struct:

typedef struct chat_info ChatInfo;
struct chat_info {
GtkWidget *text_line1;
GtkWidget *text_line2;
GtkWidget *text_line3;
GtkWidget *entry;

};

チャット ボックスを初期化する関数は次のとおりです。

static void get_chatbox(GtkWidget ** vbox, gpointer data) {

GuiInfo *g = (GuiInfo *) data;

ChatInfo *c;
c = (ChatInfo *) malloc(sizeof(ChatInfo));

g->chat = c;

GtkWidget *text_line1;
GtkWidget *text_line2;
GtkWidget *text_line3;

GtkWidget *entry;
GtkEntryBuffer *buffer;

text_line1 = gtk_label_new("");
text_line2 = gtk_label_new("");
text_line3 = gtk_label_new("");

buffer = gtk_entry_buffer_new(NULL, -1);
entry = gtk_entry_new_with_buffer(buffer);


gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);


gtk_box_pack_end(GTK_BOX(*vbox), entry, FALSE, FALSE, 1);
gtk_box_pack_end(GTK_BOX(*vbox), text_line3, FALSE, FALSE, 1);
gtk_box_pack_end(GTK_BOX(*vbox), text_line2, FALSE, FALSE, 1);
gtk_box_pack_end(GTK_BOX(*vbox), text_line1, FALSE, FALSE, 1);


gtk_misc_set_alignment((GtkMisc *) text_line1, .01, .5);
gtk_misc_set_alignment((GtkMisc *) text_line2, .01, .5);
gtk_misc_set_alignment((GtkMisc *) text_line3, .01, .5);
gtk_misc_set_alignment((GtkMisc *) entry, .01, .5);

g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(send_message), g);
}

コールバックは次のとおりです。

static void send_message(GtkWidget *window, gpointer data){
GuiInfo *g = (GuiInfo *) data;


ChatInfo *c = g->chat;

const gchar *message = gtk_entry_get_text(GTK_ENTRY(c->entry));

const gchar *oldtext3 = gtk_label_get_text(c->text_line3);
const gchar *oldtext2 = gtk_label_get_text(c->text_line2);



gtk_label_set_text(c->text_line3, message);
gtk_label_set_text(c->text_line2, oldtext3);
gtk_label_set_text(c->text_line1, oldtext2);


}

この行でセグ フォールトが発生しましたが、その理由がわかりません。

const gchar *message = gtk_entry_get_text(GTK_ENTRY(c->entry));

4

2 に答える 2

3

あなたはmalloccとあなたgtk_label_newのtext_line1など...しかしあなたは決してしません

c->text_line1 = text_line1;

get_chatbox() 、私はそれがエントリについても同じだと思います:)

したがって、c-> entryを使用するときは、単一​​化された値を使用します

結果は

static void get_chatbox(GtkWidget ** vbox, gpointer data)
{
     GuiInfo*        g = (GuiInfo*)data;
     ChatInfo*       c;
     GtkWidget*      text_line1;
     GtkWidget*      text_line2;
     GtkWidget*      text_line3;
     GtkWidget*      entry;
     GtkEntryBuffer* buffer;

     c = malloc(sizeof(*ChatInfo));
     g->chat = c;
     text_line1 = gtk_label_new("");
     text_line2 = gtk_label_new("");
     text_line3 = gtk_label_new("");
     buffer = gtk_entry_buffer_new(NULL, -1);
     entry = gtk_entry_new_with_buffer(buffer);
     gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
     //------MY ADD-------
     c->text_line1 = text_line1;
     c->text_line2 = text_line2;
     c->text_line3 = text_line3;
     c->entry = entry;
     //-------------------

     gtk_box_pack_end(GTK_BOX(*vbox), entry, FALSE, FALSE, 1);
     gtk_box_pack_end(GTK_BOX(*vbox), text_line3, FALSE, FALSE, 1);
     gtk_box_pack_end(GTK_BOX(*vbox), text_line2, FALSE, FALSE, 1);
     gtk_box_pack_end(GTK_BOX(*vbox), text_line1, FALSE, FALSE, 1);


     gtk_misc_set_alignment((GtkMisc *) text_line1, .01, .5);
     gtk_misc_set_alignment((GtkMisc *) text_line2, .01, .5);
     gtk_misc_set_alignment((GtkMisc *) text_line3, .01, .5);
     gtk_misc_set_alignment((GtkMisc *) entry, .01, .5);
     g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(send_message), g);
}
于 2013-02-21T23:04:14.513 に答える
1

get_chatbox では、ローカルで次のように宣言します。

GtkWidget *text_line1;
GtkWidget *text_line2;
GtkWidget *text_line3;

GtkWidget *entry;

cのメンバーを参照するつもりだと思うので、これらのローカル変数を宣言する必要はなく、代わりに次を使用します。

c->text_line1 = gtk_label_new("");
c->text_line2 = gtk_label_new("");
c->text_line3 = gtk_label_new("");

c->entry = gtk_entry_new_with_buffer(buffer);
于 2013-02-21T23:12:55.340 に答える