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

GTK3+ C语言文件选择器FileFilter下拉列表点击不显示问题

GTK3+ 文件选择对话框过滤器下拉列表无响应问题

问题现象

在Linux环境下用GCC开发GTK3+ C语言GUI程序时,创建的文件选择对话框存在如下异常:

  • 文件过滤功能正常,仅显示符合规则的文件类型
  • 点击过滤器下拉按钮时,仅按钮高亮,无法展开显示过滤器条目列表
  • 对话框其他功能(如文件选择、确认/取消)均正常

已核对官方文档及示例,未发现API使用明显错误,求问题原因。

原代码片段

GtkFileChooser *ffimg_load_chooser;
GtkFileFilter  *ffimg_load_filter;
GtkWidget      *load_file_dialog;
gint res;
GtkFileChooserAction fca_open = GTK_FILE_CHOOSER_ACTION_OPEN;

// 创建文件选择对话框
load_file_dialog = gtk_file_chooser_dialog_new ("Open File",
                                     GTK_WINDOW(win_main),
                                     fca_open,
                                     "_Cancel",
                                     GTK_RESPONSE_CANCEL,
                                     "_Open",
                                     GTK_RESPONSE_ACCEPT,
                                     NULL);

// 创建文件过滤器,添加多类型匹配规则
ffimg_load_filter  = gtk_file_filter_new();
gtk_file_filter_set_name (ffimg_load_filter,"Flat Field Images");
gtk_file_filter_add_pattern (ffimg_load_filter, "*.pgm");                                     
gtk_file_filter_add_pattern (ffimg_load_filter, "*.ppm");                                     
gtk_file_filter_add_pattern (ffimg_load_filter, "*.bmp");                                     
gtk_file_filter_add_pattern (ffimg_load_filter, "*.dou");                                     

// 配置对话框参数
ffimg_load_chooser = GTK_FILE_CHOOSER (load_file_dialog);
gtk_file_chooser_add_filter (ffimg_load_chooser,ffimg_load_filter);
gtk_file_chooser_set_current_folder (ffimg_load_chooser,FFFile);
gtk_window_set_title (GTK_WINDOW(load_file_dialog),"Flat Field Image");

// 运行对话框
res = gtk_dialog_run (GTK_DIALOG (load_file_dialog));
if (res == GTK_RESPONSE_ACCEPT)
 {
   char msgtxt[256];
   gchar *filename;
   int imfmt,lht,lwd;
   int16_t bitcount;
   
   filename = gtk_file_chooser_get_filename (ffimg_load_chooser);
    
   // 文件加载逻辑(省略)
   g_free(filename);
}

// 清理资源
gtk_file_chooser_remove_filter(ffimg_load_chooser,ffimg_load_filter);
gtk_widget_hide(load_file_dialog);

原运行效果

无下拉文件列表


问题原因与解决方案

核心原因

GTK3+的文件选择器下拉过滤器列表,仅当添加了两个及以上独立的GtkFileFilter对象时才会显示下拉选项;原代码仅创建并添加了一个包含多规则的过滤器,下拉按钮没有可展开的选项集合,因此点击后无响应。

修正方案

将单一过滤器拆分为多个独立过滤器(每种文件类型对应一个GtkFileFilter),分别添加到对话框中,下拉列表即可正常显示。

修正后代码

static void btn_cs_load_flatfield_click(GtkWidget *widget, gpointer data) 
// 仅获取文件名并验证格式,不执行图片加载逻辑
{
 gint res;
 GtkFileChooserAction fca_open = GTK_FILE_CHOOSER_ACTION_OPEN;
 GtkFileChooser *ffimg_load_chooser;
 GtkFileFilter  *ffimg_pgm_filter;
 GtkFileFilter  *ffimg_ppm_filter;
 GtkFileFilter  *ffimg_bmp_filter;
 GtkFileFilter  *ffimg_dou_filter;
 
 ff_pending=0;
 
 // 为每种文件类型创建独立过滤器
 ffimg_pgm_filter  = gtk_file_filter_new();
 gtk_file_filter_set_name (ffimg_pgm_filter,"pgm images");
 gtk_file_filter_add_pattern (ffimg_pgm_filter, "*.pgm");
                                     
 ffimg_ppm_filter  = gtk_file_filter_new();
 gtk_file_filter_set_name (ffimg_ppm_filter,"ppm images");
 gtk_file_filter_add_pattern (ffimg_ppm_filter, "*.ppm");
                                     
 ffimg_bmp_filter  = gtk_file_filter_new();
 gtk_file_filter_set_name (ffimg_bmp_filter,"bmp images");
 gtk_file_filter_add_pattern (ffimg_bmp_filter, "*.bmp");
                                     
 ffimg_dou_filter  = gtk_file_filter_new();
 gtk_file_filter_set_name (ffimg_dou_filter,"dou images");
 gtk_file_filter_add_pattern (ffimg_dou_filter, "*.dou");                                     

 // 创建文件选择对话框
 load_file_dialog = gtk_file_chooser_dialog_new ("Load a Flat Field Image",
                                     GTK_WINDOW(Win_main),
                                     fca_open,
                                     "_Cancel",
                                     GTK_RESPONSE_CANCEL,
                                     "_Open",
                                     GTK_RESPONSE_ACCEPT,
                                     NULL);

 ffimg_load_chooser = GTK_FILE_CHOOSER (load_file_dialog);

 // 添加所有过滤器到对话框,并设置默认选中的过滤器
 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (ffimg_load_chooser),ffimg_pgm_filter);
 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (ffimg_load_chooser),ffimg_ppm_filter);
 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (ffimg_load_chooser),ffimg_bmp_filter);
 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (ffimg_load_chooser),ffimg_dou_filter);
 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (ffimg_load_chooser),ffimg_pgm_filter);
 // gtk_file_chooser_set_current_folder (ffimg_load_chooser,FFFile);
 
 // 运行对话框
 res = gtk_dialog_run (GTK_DIALOG (ffimg_load_chooser));
 if (res == GTK_RESPONSE_ACCEPT)
  {
   gchar *filename;
   filename = gtk_file_chooser_get_filename (ffimg_load_chooser);
   test_selected_ff_filename((char *)filename);
   g_free(filename);
  }

 // 清理资源并销毁对话框
 gtk_file_chooser_remove_filter(ffimg_load_chooser,ffimg_pgm_filter);
 gtk_file_chooser_remove_filter(ffimg_load_chooser,ffimg_ppm_filter);
 gtk_file_chooser_remove_filter(ffimg_load_chooser,ffimg_bmp_filter);
 gtk_file_chooser_remove_filter(ffimg_load_chooser,ffimg_dou_filter);
 gtk_widget_destroy(load_file_dialog);
 
 return;
}

修正后运行效果

正常显示下拉列表


内容的提问来源于stack exchange,提问作者WildCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:40:36