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
相关产品推荐
相关产品推荐

