如何正确传递给gtk4参数值?

问题描述 投票:0回答:1

我正在尝试将 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

pointers arguments gtk gtk4
1个回答
0
投票

使用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”。

© www.soinside.com 2019 - 2024. All rights reserved.