GTK + 2.0组合框 - 如何获得参赛作品的位置?

时间:2015-04-28 01:45:15

标签: c++ c gtk

#include <gtk/gtk.h>
//Defined a comboBox like this 
combo = gtk_combo_box_new_text();

//Added entries like this 
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "string");

//How to get a particular entry deleted from the list of entries in the ComboBox combo?

如何删除comboBox中的特定条目?例如 - ComboBox下拉列表中有“Foo”,“Boo”,“Hoo”等条目。现在我想选择“Boo”然后将其删除?我该怎么做?

//删除错误时出现分段错误

mcve -

fixed = gtk_fixed_new();
combo = gtk_combo_box_new_text();
gtk_fixed_put(GTK_FIXED(fixed), combo, 50, 50);
label = gtk_label_new("Rooms");
gtk_fixed_put(GTK_FIXED(fixed), label, 50, 30 );
gtk_table_attach_defaults (GTK_TABLE (table), fixed, 2, 3, 0, 2);
g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(combo_selected), (gpointer) label);

在这个回调函数中,我只是将当前选择复制到全局声明的字符串。接下来,在其他一些函数中,我尝试运行它 -

gtk_combo_box_remove_text (GTK_COMBO_BOX(combo), gtk_combo_box_get_active (GTK_COMBO_BOX(combo))); //statement where seg fault occurs

gtk_combo_box_get_active为我提供了要删除的相应索引条目。注 - GtkWidget * combo在程序中全局定义。

1 个答案:

答案 0 :(得分:0)

组合框中活动(当前选中)条目的ID可以通过gtk_combo_box_get_active获取,并且可以借助gtk_combo_box_text_removegtk_combo_box_remove_text删除它 (取决于使用的api版本。前者(gtk_combo_box_text_remove)更新)。

如果没有活动项,则

gtk_combo_box_get_active返回-1,因此在将其传递给其中一个remove函数之前应该进行检查。如果如上所述,在信号处理程序中进行删除,则这尤其重要。根据{{​​3}}“已更改”信号

  更改活动项目时会发出

[...]。这可能是由于用户从列表中选择了不同的项目,或者是由于调用了gtk_combo_box_set_active_iter()。在输入带有条目的组合框条目时也会发出它。 [...]

据我所知,这包括取消选择项目的时间(如果删除该项目,可能会发生这种情况)。

因此,您的处理程序应该看起来像这样:

void combo_selected(GtkComboBox *widget, gpointer user_data)
{
    int active_id=gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
    if(active_id!=-1)
    {
        //do real work...
    }
}