这是我先前在这里提出的问题的跟进问题:GTK Retrieve values from multiple widgets on button press
我仍在尝试解决相同的问题,但是已根据上一个问题的回答实施了建议。
这是我的完整代码:
#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;
}
当我按下按钮尝试检索值时,出现此错误:
(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
。
如果由于某些原因必须使用其他函数,而该函数仅使用一个参数,该参数与定义的签名中的第二个参数匹配,(因为使用了某些库函数,则可以使用g_signal_connect_swapped
。
在链接问题中,我的答案告诉您使用g_signal_connect_swapped
修复签名或。两者都不是。
正确的组合是:
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);
您可以通过在调试器中运行程序并在回调函数中查看cb_data
中的init
和button
+ user_data
的地址来轻松地检测到这一点。在许多情况下,在调试器中运行程序通常是一个好主意。