C GTK-按按钮从窗口小部件中检索多个值

C GTK-按按钮从窗口小部件中检索多个值,c,parsing,gtk,C,Parsing,Gtk,这是我上一个问题的后续问题: 我仍在努力解决同样的问题,但是我已经实施了前一个问题回答中的建议 这是我的全部代码: #include <gtk/gtk.h> struct data { GtkEntry *hash; GtkWidget *hashType; }; static void queue_hash (GtkButton *button, gpointer user_data) { struct data *dataStruct = user_

这是我上一个问题的后续问题:

我仍在努力解决同样的问题,但是我已经实施了前一个问题回答中的建议

这是我的全部代码:

#include <gtk/gtk.h>

struct data {
    GtkEntry *hash;
    GtkWidget *hashType;
};

static void queue_hash (GtkButton *button, gpointer user_data) {

    struct data *dataStruct = user_data;

    GtkEntry *hashWid = dataStruct->hash;
    GtkWidget *hashTypeWid = dataStruct->hashType;

    const char* hash = gtk_entry_get_text(hashWid);
    char* hashType = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(hashTypeWid));

    g_print ("Queue Hash: %s    %s\n", hash, hashType);
}


static void init(GtkApplication* app, gpointer user_data) {
    GtkWidget *window;
    GtkWidget *window_fixed;
    GtkWidget *nodeListBox;
    GtkWidget *hashListBox;
    GtkWidget *queueButtonBox;
    GtkWidget *queueButton;
    GtkWidget *hashEntry;
    GtkWidget *hashSelect;
    GtkWidget *remHashButton;
    GtkWidget *remHashButtonBox;
    GtkWidget *logBox;
    GtkWidget *nodesLabel;
    GtkWidget *hashLabel;

    window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), "HashCrack Server");
    gtk_window_set_default_size (GTK_WINDOW (window), 1000, 435);
    gtk_window_set_resizable (GTK_WINDOW(window), FALSE);

    window_fixed = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), window_fixed);

    queueButtonBox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
    queueButton = gtk_button_new_with_label("Queue Hash");
    remHashButtonBox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
    remHashButton = gtk_button_new_with_label("Remove Selected Hash");

    nodeListBox = gtk_list_box_new();
    gtk_widget_set_size_request(nodeListBox, 250, 365);
    hashListBox = gtk_list_box_new();
    gtk_widget_set_size_request(hashListBox, 250, 325);

    nodesLabel = gtk_label_new("Connected Nodes");
    gtk_label_set_markup(GTK_LABEL(nodesLabel), "<span font_desc=\"20.0\">Connected Nodes</span>");
    gtk_fixed_put(GTK_FIXED(window_fixed), nodesLabel, 40, 15);

    hashLabel = gtk_label_new("Connected Nodes");
    gtk_label_set_markup(GTK_LABEL(hashLabel), "<span font_desc=\"20.0\">Queued Hashes</span>");
    gtk_fixed_put(GTK_FIXED(window_fixed), hashLabel, 755, 15);

    hashEntry = gtk_entry_new();
    gtk_widget_set_size_request(hashEntry, 290, 33);
    gtk_fixed_put(GTK_FIXED(window_fixed), hashEntry, 300, 75);

    hashSelect = gtk_combo_box_text_new();
    gtk_widget_set_size_request(hashSelect, 102, 25);
    gtk_fixed_put(GTK_FIXED(window_fixed), hashSelect, 595, 75);
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(hashSelect), "MD5");
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(hashSelect), "SHA1");
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(hashSelect), "ROT16");
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(hashSelect), "###");

    gtk_widget_set_size_request(queueButtonBox, 390, 25);
    gtk_widget_set_size_request(queueButton, 390, 25);
    gtk_fixed_put(GTK_FIXED(window_fixed), queueButtonBox, 300, 120);

    struct data *cb_data = g_new0(struct data, 1);
    cb_data->hash = GTK_ENTRY(hashEntry);
    cb_data->hashType = hashSelect;
    g_signal_connect_swapped(queueButton, "clicked", G_CALLBACK (queue_hash), cb_data);

    logBox = gtk_text_view_new();
    gtk_widget_set_size_request(logBox, 400, 240);
    gtk_fixed_put(GTK_FIXED(window_fixed), logBox, 300, 175);

    gtk_widget_set_size_request(remHashButtonBox, 200, 25);
    gtk_widget_set_size_request(remHashButton, 200, 25);
    gtk_fixed_put(GTK_FIXED(window_fixed), remHashButtonBox, 750, 390);

    gtk_container_add(GTK_CONTAINER(queueButtonBox), queueButton);
    gtk_container_add(GTK_CONTAINER(remHashButtonBox), remHashButton);
    gtk_fixed_put(GTK_FIXED(window_fixed), nodeListBox, 25, 50);
    gtk_fixed_put(GTK_FIXED(window_fixed), hashListBox, 725, 50);

    gtk_widget_show_all(window);
}

int main(int argc, char **argv) {
    GtkApplication *app;
    int status;

    app = gtk_application_new ("com.sds.hashcrack", G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (init), NULL);
    status = g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref (app);

    return status;
}

任何帮助都将不胜感激,谢谢。

您误解了
g\u信号\u连接\u交换的工作原理

如果您提供的功能与手册中给出的签名相匹配,则不得使用
g\u signal\u connect\u swapped
!改用
g\u信号连接

如果出于某些原因,您必须使用不同的函数,该函数只接受一个与定义的签名中的第二个参数相匹配的参数(因为您使用了一些库函数),那么您可以使用
g\u signal\u connect\u swapped

在链接问题中,我的回答告诉您修复签名或使用
g\u信号\u连接\u交换
。不是两者都有

正确的组合是:

static void queue_hash (GtkButton *button, gpointer user_data) {

    struct data *dataStruct = user_data;
...
}

g_signal_connect(queueButton, "clicked", G_CALLBACK (queue_hash), cb_data);

通过在调试器中运行程序并查看
init
中的
cbu data
地址和回调函数中的
按钮
+
用户_data
,您可以很容易地检测到这一点。
在许多情况下,在调试器中运行程序通常是一个好主意。

这就解决了问题!非常感谢您的帮助和耐心!我真的很感激:)
static void queue_hash (GtkButton *button, gpointer user_data) {

    struct data *dataStruct = user_data;
...
}

g_signal_connect(queueButton, "clicked", G_CALLBACK (queue_hash), cb_data);
static void queue_hash (struct data *dataStruct) {
...
}

g_signal_connect_swapped(queueButton, "clicked", G_CALLBACK (queue_hash), cb_data);