【问题标题】:GTK Retrieve values from multiple widgets on button pressGTK 在按钮按下时从多个小部件中检索值
【发布时间】:2020-03-12 14:44:58
【问题描述】:

我正在尝试在按下按钮时从窗口中的条目字段和组合框中检索一个值。我目前正在努力这样做。有人告诉我,为了获得多个值,我需要使用结构。但是我正在努力让它发挥作用。这是我目前所拥有的:

按下按钮时运行的功能:

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

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • hashentryhashSelect 是如何定义和初始化的?
  • @Gerhardh 请接受我对缺乏响应能力的歉意,我通常反应迅速,但是在过去的几天里,我不得不处理一些意外的事情把我的注意力引开了。 HashEntry 和 HashSelect 定义如下:
  • @Gerhardh 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");
  • 不用道歉。只要您提供缺少的信息,一切都很好。

标签: c parsing button gtk gtk3


【解决方案1】:

manual 告诉我们"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);
}

【讨论】:

  • 感谢您指出这一点,我显然误读了它是必需的语法,所以我很抱歉。我现在已经更新了我的代码以反映这种变化,但是我很难看到我如何利用这些参数来获取我试图访问的两个小部件的值?抱歉,我对 GTK 很陌生,我很难理解它。谢谢
  • 您以正确的方式访问了这些值,但参数无效。尝试更新函数签名。
  • 非常感谢您到目前为止的帮助,我真的很感激!再次抱歉几天才回复,这真的被搁置了,我已经提出了很多。我已经实施了您的更改,但仍然看到此错误:(SDS-CW:25413): Gtk-CRITICAL **: 19:18:19.125: gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed,我很难知道为什么?
  • 请发布一个新问题并提供MCVE 与您的更改。如果没有看到所有相关代码,则无法回答。
  • 如果您认为某个答案有助于解决问题,您可能会考虑支持和/或接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多