如何更改按钮单击 GTK c 上的多个小部件属性
Posted
技术标签:
【中文标题】如何更改按钮单击 GTK c 上的多个小部件属性【英文标题】:how to change multiple widgets property on button click GTK c 【发布时间】:2021-09-13 19:54:11 【问题描述】:我正在尝试使用 GTK in c for raspberry pi 4 制作 UI。我想根据按钮单击更改不同小部件的可见性,以模拟新页面。我已经尝试了互联网上所有可用的东西,但由于我不擅长编码,所以我无法弄清楚哪里出了问题。 有人可以帮忙吗?
这个程序可以编译,但是当我按下按钮时,它会给出错误“在 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
【问题讨论】:
由于您的程序正在正确构建,因此这不是关于 CMake 的问题。将来,如果您使用[cmake]
标记,您应该发布您的 CMake 代码。
【参考方案1】:
“点击”回调的函数签名是错误的。它应该是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);
【讨论】:
以上是关于如何更改按钮单击 GTK c 上的多个小部件属性的主要内容,如果未能解决你的问题,请参考以下文章