我正在尝试将 argv 值传递给按钮标签,但它的工作方式不可预测
在下面的程序中,对 argv 和 argc 使用 gtk_init();,但是递增工作方式错误,地址没有按我的预期增加,并且出现奇怪的错误消息: GLib-GIO-CRITICAL **:19:48:26.883:此应用程序无法打开文件 主要代码:
GtkApplication *app;
gtk_init();
int status;
*++argv;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), argv);
激活码:
GtkWidget *window;
GtkWidget *grid;
GtkWidget *button;
char *word;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW (window), "Window");
grid = gtk_grid_new();
gtk_window_set_child (GTK_WINDOW (window), grid);
//(char **) user_data;
word = user_data;
printf("1user_data:%p\n", user_data);
printf("1user_data:%lu\n",sizeof(user_data));
button = gtk_button_new_with_label (user_data);
g_signal_connect (button , "clicked", G_CALLBACK (print_hello), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1);
button = gtk_button_new_with_label ("Button 2");
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1);
//*++user_data;
++user_data;
printf("2user_data:%p\n", user_data);
printf("2user_data:%lu\n",sizeof(user_data));
button = gtk_button_new_with_label(user_data);
g_signal_connect(button, "clicked",G_CALLBACK (button1),"text");
gtk_grid_attach (GTK_GRID (grid), button, 2, 0, 1, 1);
button = gtk_button_new_with_label ("Quit");
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_destroy), window);
gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1);
gtk_widget_show (window);
当我增加 argv : ++argv 获取地址时: 0x7ffc1535cff0 0x7ffc1535cff8 当我增加 user_data: ++user_data 获取地址时: 0x7ffc1535cff0 0x7ffc1535cff1
使用GTK4和C,我会像这样解决你的问题:
#include <gtk/gtk.h>
static int command_line (GtkApplication *app,
GApplicationCommandLine *cmdline)
{
gchar **argv;
gint argc;
gint i;
argv = g_application_command_line_get_arguments(cmdline, &argc);
GtkWidget *window;
GtkWidget *grid;
GtkWidget *button;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW (window), "Window");
grid = gtk_grid_new();
gtk_window_set_child (GTK_WINDOW (window), grid);
button = gtk_button_new_with_label (argv[1]);
// g_signal_connect (button , "clicked", G_CALLBACK (print_hello), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1);
button = gtk_button_new_with_label ("Button 2");
// g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1);
button = gtk_button_new_with_label(argv[2]);
// g_signal_connect(button, "clicked",G_CALLBACK (button1),"text");
gtk_grid_attach (GTK_GRID (grid), button, 2, 0, 1, 1);
button = gtk_button_new_with_label ("Quit");
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_destroy), window);
gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1);
gtk_widget_set_visible (window,TRUE);
}
int
main (int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_HANDLES_COMMAND_LINE);
g_signal_connect (app, "command-line", G_CALLBACK (command_line),NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
程序调用可以是“. .out left right”。