如何在按钮单击 GTK c 时更改多个小部件 属性

how to change multiple widgets property on button click GTK c

我正在尝试 UI 在 c 中使用 GTK for raspberry pi 4. 我想根据按钮单击来更改不同小部件的可见性,只是为了模拟一个新页面。我已经尝试了互联网上的所有可用内容,但由于我不太擅长编码,所以我无法弄清楚哪里出了问题。 有人可以帮忙吗?

这个程序可以编译,但是当我按下按钮时,它会给出错误“gtk_widget_show 上的断言失败”以及小部件隐藏。还发生段错误,程序崩溃。

我正在使用 cmake 来编译我的代码。我已附上错误屏幕截图。

#include <gtk/gtk.h>

typedef struct AppData 
{
    GtkWidget *label1;
    GtkWidget *label2;
} AppData;

static void button1 (gpointer data)
{  
  AppData *data2 = (AppData*)data;
  gtk_widget_hide(data2->label1);
  gtk_widget_show(data2->label2);
}

static void button2 ( gpointer data)
{
  AppData *data2 = (AppData*)data;
  gtk_widget_show(data2->label1);
  gtk_widget_hide(data2->label2);
}

int main(int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *fixed;
  
  GtkWidget *btn1;
  GtkWidget *btn2;
  
  GtkWidget *box1;
  GtkWidget *box2;
  
  gtk_init(&argc, &argv);
  
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "ethercat test 1");
  gtk_window_set_default_size(GTK_WINDOW(window), 1000,500);
  
  fixed = gtk_fixed_new();
  gtk_container_add(GTK_CONTAINER(window), fixed);
  
  box1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
  gtk_fixed_put(GTK_FIXED(fixed), box1, 0,0);
  
  box2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
  gtk_fixed_put(GTK_FIXED(fixed), box2, 100,100);
  
  AppData *app_data = g_new0 (AppData, 2);

  app_data->label1 = gtk_label_new("label1");
  gtk_box_pack_start(GTK_BOX(box1),app_data->label1, TRUE,TRUE,0);
  
  app_data->label2 = gtk_label_new("label2");
  gtk_box_pack_start(GTK_BOX(box2),app_data->label2, TRUE,TRUE,0);
  
  btn1 = gtk_button_new_with_label("ethercat 1");
  gtk_fixed_put(GTK_FIXED(fixed), btn1, 10, 450);
  gtk_widget_set_size_request(btn1, 80,30);
 
  btn2 = gtk_button_new_with_label("ethercat 2");
  gtk_fixed_put(GTK_FIXED(fixed), btn2, 110, 450);
  gtk_widget_set_size_request(btn2, 80,30);

  gtk_widget_show_all(window);
  
  g_signal_connect(G_OBJECT(btn1), "clicked", G_CALLBACK(button1), app_data);
  g_signal_connect(G_OBJECT(btn2), "clicked", G_CALLBACK(button2), app_data);
  
  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  
  gtk_main();
  
  printf("program end\n");
  return (0);
  
}

enter image description here

您的“点击”回调的函数签名是错误的。它应该是 documentation:

中描述的形式
void on_clicked(
  GtkButton* self,
  gpointer user_data
)

例如,您的 button2() 函数变为

static void button2 (GtkButton *btn2, gpointer data)
{
  AppData *data2 = (AppData*)data;
  gtk_widget_show(data2->label1);
  gtk_widget_hide(data2->label2);
}