在 GTK+2 中点击按钮后重新定义标签
Redefine a label after a click button in GTK+2
我有以下代码,我想在按下按钮 "hlpBtn" 时更改标签 "title" 的值,但我遇到了麻烦。
#include <gtk/gtk.h>
void button_clicked(GtkWidget *widget, gpointer data)
{
GtkWidget *title = (GtkWidget *) data;
title = gtk_label_new("DECODED!!");
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *table;
GtkWidget *title;
GtkWidget *wins;
GtkWidget *halign;
GtkWidget *halign2;
GtkWidget *hlpBtn;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_set_size_request (window, 650, 850);
gtk_window_set_title(GTK_WINDOW(window), "Windows");
gtk_container_set_border_width(GTK_CONTAINER(window), 15);
table = gtk_table_new(6, 4, FALSE);
gtk_table_set_col_spacings(GTK_TABLE(table), 3);
gtk_table_set_row_spacing(GTK_TABLE(table), 0, 3);
title = gtk_label_new("Decrypting code...");
halign = gtk_alignment_new(0, 0, 0, 0);
gtk_container_add(GTK_CONTAINER(halign), title);
gtk_table_attach(GTK_TABLE(table), halign, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
halign2 = gtk_alignment_new(0, 1, 0, 0);
hlpBtn = gtk_button_new_with_label("RUN");
gtk_container_add(GTK_CONTAINER(halign2), hlpBtn);
gtk_widget_set_size_request(hlpBtn, 70, 30);
gtk_table_set_row_spacing(GTK_TABLE(table), 3, 5);
gtk_table_attach(GTK_TABLE(table), halign2, 0, 1, 4, 5,
GTK_FILL, GTK_FILL, 0, 0);
g_signal_connect(G_OBJECT(hlpBtn), "clicked",
G_CALLBACK(button_clicked), title);
gtk_container_add(GTK_CONTAINER(window), table);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), G_OBJECT(window));
gtk_widget_show_all(window);
gtk_main();
return 0;
}
我的意图是在按下 hlpBtn 时调用函数 button_clicked,然后将标题从 "Decrypting code..." 更改为 "DECODED!!"。
这里有什么问题?
谢谢。
你为什么不做这样的事情,而不是创建一个新标签?
void button_clicked(GtkWidget *widget, gpointer data)
{
gtk_label_set_text((GtkLabel *)data, "DECODED!!");
}
您的代码有什么问题:您获取了一个指向现有标签的指针,制作了它的本地副本,创建了一个新标签并用指向新项目的指针覆盖了本地指针。问题是,覆盖指针并不意味着替换 window 中的原始项目。您需要销毁现有标签,然后添加新实例。但正如您从我的代码中看到的那样,解决方案比这简单得多:只需使用新内容更新现有标签即可。
我有以下代码,我想在按下按钮 "hlpBtn" 时更改标签 "title" 的值,但我遇到了麻烦。
#include <gtk/gtk.h>
void button_clicked(GtkWidget *widget, gpointer data)
{
GtkWidget *title = (GtkWidget *) data;
title = gtk_label_new("DECODED!!");
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *table;
GtkWidget *title;
GtkWidget *wins;
GtkWidget *halign;
GtkWidget *halign2;
GtkWidget *hlpBtn;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_set_size_request (window, 650, 850);
gtk_window_set_title(GTK_WINDOW(window), "Windows");
gtk_container_set_border_width(GTK_CONTAINER(window), 15);
table = gtk_table_new(6, 4, FALSE);
gtk_table_set_col_spacings(GTK_TABLE(table), 3);
gtk_table_set_row_spacing(GTK_TABLE(table), 0, 3);
title = gtk_label_new("Decrypting code...");
halign = gtk_alignment_new(0, 0, 0, 0);
gtk_container_add(GTK_CONTAINER(halign), title);
gtk_table_attach(GTK_TABLE(table), halign, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
halign2 = gtk_alignment_new(0, 1, 0, 0);
hlpBtn = gtk_button_new_with_label("RUN");
gtk_container_add(GTK_CONTAINER(halign2), hlpBtn);
gtk_widget_set_size_request(hlpBtn, 70, 30);
gtk_table_set_row_spacing(GTK_TABLE(table), 3, 5);
gtk_table_attach(GTK_TABLE(table), halign2, 0, 1, 4, 5,
GTK_FILL, GTK_FILL, 0, 0);
g_signal_connect(G_OBJECT(hlpBtn), "clicked",
G_CALLBACK(button_clicked), title);
gtk_container_add(GTK_CONTAINER(window), table);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), G_OBJECT(window));
gtk_widget_show_all(window);
gtk_main();
return 0;
}
我的意图是在按下 hlpBtn 时调用函数 button_clicked,然后将标题从 "Decrypting code..." 更改为 "DECODED!!"。
这里有什么问题?
谢谢。
你为什么不做这样的事情,而不是创建一个新标签?
void button_clicked(GtkWidget *widget, gpointer data)
{
gtk_label_set_text((GtkLabel *)data, "DECODED!!");
}
您的代码有什么问题:您获取了一个指向现有标签的指针,制作了它的本地副本,创建了一个新标签并用指向新项目的指针覆盖了本地指针。问题是,覆盖指针并不意味着替换 window 中的原始项目。您需要销毁现有标签,然后添加新实例。但正如您从我的代码中看到的那样,解决方案比这简单得多:只需使用新内容更新现有标签即可。