You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:02:33