GTK-按下按钮即可从小部件中检索多个值 [英] GTK - Retrieve multiple values from widgets on button press

查看:86
本文介绍了GTK-按下按钮即可从小部件中检索多个值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我对上一个问题的跟进问题: GTK在按下按钮时从多个小部件中检索值

This is a follow up question to my previous question here: GTK Retrieve values from multiple widgets on button press

我仍在尝试解决相同的问题,但是已根据上一个问题的回答实施了建议.

I am still trying to solve the same issue, however have implemented suggestions from the previous question's responses.

这是我的完整代码:

#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;
}

当我按下按钮尝试检索值时,出现此错误:

And when I press my button to try and retrieve the values, I get this error:

(SDS-CW:25413): Gtk-CRITICAL **: 19:18:19.125: gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed

非常感谢您的帮助.

推荐答案

您误解了g_signal_connect_swapped的工作方式.

如果提供的功能与手册中提供的签名相匹配,则不得使用g_signal_connect_swapped!改为使用g_signal_connect.

If you provide a function that matches the signature given in the manual, you mustn't use g_signal_connect_swapped! Use g_signal_connect instead.

如果由于某些原因您必须使用其他函数,而该函数仅采用1个与定义的签名中的第二个参数匹配的参数(因为使用了某些库函数),则可以使用g_signal_connect_swapped.

If for some reasons you must use a different function, that only takes 1 parameter that matches second parameter from the defined signature, (because you use some library function) then you can use g_signal_connect_swapped.

在链接问题中,我的答案告诉您修正签名或使用g_signal_connect_swapped.两者都不是.

In the linkes question my answer tells you to fix signature or use g_signal_connect_swapped. Not both.

正确的组合是:

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);

您可以通过在调试器中运行程序并在回调函数中查看init中的cb_databutton + user_data的地址来轻松检测到这一点. 在许多情况下,在调试器中运行程序通常是个好主意.

You can easily detect this by running your program in a debugger and look at the address of cb_data in init and button + user_data in your callback function. Running your program in a debugger is generally a good idea in many cases.

这篇关于GTK-按下按钮即可从小部件中检索多个值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆