Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Gtk中的基本聊天_C_Gtk - Fatal编程技术网

C Gtk中的基本聊天

C Gtk中的基本聊天,c,gtk,C,Gtk,所以,我有三个标签和一个输入框。我的目标是每次在输入框中键入并按enter键时,文本都会显示在第三个标签中。如果再次执行此操作,文本将显示在第三个标签中,旧文本将移动到第二个标签中,依此类推(因此标签将显示您键入的最后三条消息) 以下是初始化聊天室的功能: static void get_chatbox(GtkWidget ** vbox, gpointer data) { GuiInfo *g = (GuiInfo *) data; ChatInfo *c; c = (ChatInfo *

所以,我有三个标签和一个输入框。我的目标是每次在输入框中键入并按enter键时,文本都会显示在第三个标签中。如果再次执行此操作,文本将显示在第三个标签中,旧文本将移动到第二个标签中,依此类推(因此标签将显示您键入的最后三条消息)

以下是初始化聊天室的功能:

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);


}
我发现这条线路有seg故障,不确定原因:


const gchar*message=gtk_entry\u get_text(gtk_entry(c->entry))

你是malloc c,你是
gtk\u label\u new
你的文本行1等等。。。 但你从来没有这样做过

c->text_line1 = text_line1;
get\u 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);
}

您可以使用malloc c和
gtk\u label\u new
文本行1等。。。 但你从来没有这样做过

c->text_line1 = text_line1;
get\u 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);
}

在get_聊天框中,您可以在本地声明:

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);

在get_聊天框中,您可以在本地声明:

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);

您也可以使用
c=g_new(ChatInfo,1)
代替
c=(ChatInfo*)malloc(sizeof(ChatInfo))这使得分配在键入时不那么麻烦。您也可以使用
c=g_new(ChatInfo,1)
而不是
c=(ChatInfo*)malloc(sizeof(ChatInfo))这使得分配对类型来说不那么麻烦。