GTK下拉框条目排序问题:如何实现字母序排列?
解决GTK下拉框条目按字母顺序排序的问题
你的代码核心问题是未给GtkStringSorter指定要排序的字符串属性。GtkStringList的每个元素是GtkStringObject类型,它的字符串内容存储在string属性中,但你创建的排序器不知道要提取这个属性,导致无法进行有效比较,既不会排序,还会引发运行时错误。
以下是修正后的完整代码:
#include <gtk/gtk.h> int main(int argc, char *argv[]) { gtk_init(&argc, &argv); const char *strings[4] = {"Larry","Moe","Curly",NULL}; GtkStringList *stringlist = gtk_string_list_new(strings); GtkWidget *dropdown = gtk_drop_down_new(G_LIST_MODEL(stringlist), NULL); // 创建字符串排序器并配置排序依据 GtkStringSorter *string_sorter = gtk_string_sorter_new(NULL); // 告诉排序器从GtkStringObject的"string"属性获取用于比较的字符串 gtk_string_sorter_set_expression(string_sorter, gtk_property_expression_new(GTK_TYPE_STRING_OBJECT, NULL, "string")); // 用排序模型包装原字符串列表 GtkSortListModel *sort_list_model = gtk_sort_list_model_new(G_LIST_MODEL(stringlist), GTK_SORTER(string_sorter)); // 为下拉框设置排序后的模型 gtk_drop_down_set_model(GTK_DROP_DOWN(dropdown), G_LIST_MODEL(sort_list_model)); // 测试用窗口代码 GtkWidget *window = gtk_window_new(); gtk_window_set_child(GTK_WINDOW(window), dropdown); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show(window); gtk_main(); return 0; }
关键步骤说明
- 配置排序器的表达式:
gtk_property_expression_new创建表达式,指定从GtkStringObject类型的对象中提取string属性,这是排序器进行字母比较的核心依据。 - 使用SortListModel包装原模型:
GtkSortListModel是一个包装类,它会对底层的列表模型应用排序规则,不需要修改原GtkStringList的内容。 - 替换下拉框的模型:将下拉框的模型从原GtkStringList替换为排序后的SortListModel,这样下拉框就会显示排序后的条目。
内容的提问来源于stack exchange,提问作者9-Pin
相关产品推荐
相关产品推荐

