如何在C中更新GTK + -3.0中的标签

我似乎无法使用该function

gtk_label_set_text(); 

这就是我写的:

 #include  int main(int argc, char *argv[] ) { gtk_init(&argc, &argv); GtkWidget *label; //label label = gtk_label_new("This is my label"); gtk_label_set_text(label, "I cannot use this func"); if(GTK_IS_LABEL(label)){ g_print("IT IS A LABEL\n"); }else if (GTK_IS_WIDGET(label)){ g_print("well at least its a Widget\n"); }else { g_print("why is it not a label?! T_T\n"); } gtk_main(); return 0; } 

它说

 passing argument 1 of 'gtk_label_set_text' from incompatible pointer type expected 'struct GtkLabel *' but argument is of type 'struct GtkWidget *' 

当我尝试编译它。 好。 我改成了

 GtkLabel *label; 

但是它不允许我使用gtk_label_new(); 因为编译器抱怨

 assignment from incompatible pointer type 

然后我放弃并评论// gtk_label_set_text来询问程序GTK_IS_LABEL(标签); 并打印出它是一个标签。 我现在放弃了,并问你,亲爱的Stack Overflow社区。

由于它是C代码,因此gtk_label_new返回“基类”或结构时,您已经应用了“ gtk_label_new ”指针:

 ╰── GtkWidget ╰── GtkMisc ╰── GtkLabel ╰── GtkAccelLabel 

演员表是通过宏(见此处 )代码完成的:

 GtkWidget *label; //label label = gtk_label_new("This is my label"); gtk_label_set_text(GTK_LABEL (label), "I cannot use this func"); 

注意:在C ++中不需要GtkWidget ,因为GtkLabel结构inheritance自GtkWidget ,你可以直接在GtkLabel存储标签,但是在C中没有inheritance这样的东西。

根据[prototype] , gtk_label_set_text期望GtkLabel*作为它的第一个参数,所以改变

 gtk_label_set_text(label, "I cannot use this func"); 

 gtk_label_set_text((GtkLabel*)label, "I cannot use this func"); 

或更方便

 gtk_label_set_text(GTK_LABEL(label), "I cannot use this func"); 

实际上GTK_LABEL()宏扩展为:

 #define GTK_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LABEL, GtkLabel)) 

在标题gtklabel.h