GTK Получить значения из нескольких виджетов при нажатии кнопки - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь получить значение из поля ввода и поля со списком в моем окне при нажатии кнопки. В настоящее время я борюсь за это. Мне сказали, что для получения нескольких значений мне нужно использовать структуры. Однако я изо всех сил пытаюсь заставить это работать. Вот что у меня есть:

Функция, запускаемая при нажатии кнопки:

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

Любая помощь будет принята с благодарностью, спасибо.

1 Ответ

1 голос
/ 12 марта 2020

Инструкция сообщает нам, что обработчик сигнала для сигнала "clicked" должен следовать этой подписи:

void
user_function (GtkButton *button,
               gpointer   user_data)

Ваша функция ожидает только 1 параметр и недопустима для этого сигнала. В результате вы берете указатель button и интерпретируете его как структуру, которая потерпит неудачу.

Чтобы решить эту проблему, либо предоставьте сигнатуру с обоими параметрами, либо вы можете связать обработчик сигнала с функцией g_signal_connect_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);
}
...