C GTK在按下按钮时从多个窗口小部件检索值

C GTK在按下按钮时从多个窗口小部件检索值,c,parsing,button,gtk,gtk3,C,Parsing,Button,Gtk,Gtk3,我试图通过按下按钮从窗口中的输入字段和组合框中检索一个值。我目前正努力做到这一点。有人告诉我,为了获得多个值,我需要使用structs。然而,我正在努力让它工作。以下是我到目前为止的情况: 要在按下按钮时运行的功能: struct data { GtkWidget *hash; GtkWidget *hashType; }; static void queue_hash (struct data *dataStruct) { GtkWidget *hashWid =

我试图通过按下按钮从窗口中的输入字段和组合框中检索一个值。我目前正努力做到这一点。有人告诉我,为了获得多个值,我需要使用structs。然而,我正在努力让它工作。以下是我到目前为止的情况:

要在按下按钮时运行的功能:

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

static void queue_hash (struct data *dataStruct) {

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

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

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

}
按钮:

GtkWidget *hashEntry;
GtkWidget *hashSelect;

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


queueButtonBox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
queueButton = gtk_button_new_with_label("Queue Hash");

gtk_fixed_put(GTK_FIXED(window_fixed), queueButtonBox, 300, 120);


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

运行代码时,出现以下错误:

(SDS-CW:16982): GLib-GObject-WARNING **: 14:42:38.659: invalid uninstantiatable type 'void' in cast to 'GtkEntry'

(SDS-CW:16982): Gtk-CRITICAL **: 14:42:38.659: gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed
非常感谢您的帮助。

告诉我们,
“单击”信号的信号处理程序必须遵循以下签名:

void
user_function (GtkButton *button,
               gpointer   user_data)
您的函数只需要1个参数,对于此信号无效。因此,您使用
按钮
指针并将其解释为将失败的结构

要解决此问题,请提供包含这两个参数的签名,或者您可以将信号处理器与功能
g\u signal\u connect\u swapped
连接

您可以这样更改初始处理程序函数:

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

    struct data *dataStruct = user_data;

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

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

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

hashentry
hashSelect
是如何定义和初始化的?@Gerhardh请接受我的道歉,因为我的反应迟钝,我通常反应很快,但是在过去的几天里,有几件事情出人意料地发生,我不得不处理,这件事情把我的注意力转移了。HashEntry和HashSelect的定义如下:@Gerhardh
GtkWidget*HashEntry;GtkWidget*hashSelect;hashEntry=gtk_entry_new();gtk_widget_set_size_请求(hashEntry,290,33);gtk_fixed_put(gtk_fixed(window_fixed)),hashEntry,300,75;hashSelect=gtk_组合框_文本_新();gtk_widget_set_size_请求(hashSelect,102,25);gtk_fixed_put(gtk_fixed(window_fixed)),hashSelect,595,75;gtk组合框文本附加文本(gtk组合框文本(hashSelect),“MD5”);gtk组合框文本附加文本(gtk组合框文本(hashSelect),“SHA1”)无需道歉。一旦你提供了丢失的信息,一切都很好。谢谢你指出,我显然误读了它是必需的语法,所以我道歉。我现在已经更新了我的代码以反映这一变化,但是我很难看到我如何利用这些参数来获取我试图访问的两个小部件的值?对不起,我对GTK很陌生,我正努力想办法适应它。感谢您以正确的方式访问了这些值,但使用的参数无效。更新后的函数签名也可以尝试。非常感谢您在这一点上的帮助,我非常感谢!再一次抱歉,我花了几天的时间来回应,这件事真的让我感到非常遗憾,因为我已经提出了很多。我已经实现了您的更改,但是仍然看到此错误:
(SDS-CW:25413):Gtk CRITICAL**:19:18:19.125:Gtk_entry_get_text:assertion'Gtk_IS_entry(entry)'失败
,我很难理解为什么?请发布一个新问题,并提供一个包含您所做更改的答案。如果没有看到所有相关代码,则无法回答此问题。如果您觉得某个答案有助于解决问题,您可能会考虑投票和/或接受它。