GTK-按下按钮即可从小部件中检索多个值 [英] GTK - Retrieve multiple values from widgets on button press
问题描述
这是我对上一个问题的跟进问题: 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_data
和button
+ 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屋!