GTK&x2B;3本机文件选择器-允许的文件类型和默认文件名 >我使用GTK+创建一个C++程序。为了选择文件,我使用了本机文件选择器,因为gtk文件选择器存在内存泄漏

GTK&x2B;3本机文件选择器-允许的文件类型和默认文件名 >我使用GTK+创建一个C++程序。为了选择文件,我使用了本机文件选择器,因为gtk文件选择器存在内存泄漏,c++,gtk,gtk3,filechooser,C++,Gtk,Gtk3,Filechooser,我的问题是:如何在GTK+中为本机文件选择器(保存时)设置默认文件名,以及如何为其设置文件过滤器,以便仅打开或保存特定的文件扩展名 我的程序在Win32上运行。 示例代码: static void cb_SaveFileAs(GtkWidget *caller) { GtkWindow *parent_window = GTK_WINDOW(caller); GtkFileChooserNative *native; GtkFileChooserAction action

我的问题是:如何在GTK+中为本机文件选择器(保存时)设置默认文件名,以及如何为其设置文件过滤器,以便仅打开或保存特定的文件扩展名

我的程序在Win32上运行。 示例代码:

static void cb_SaveFileAs(GtkWidget *caller)
{
    GtkWindow *parent_window = GTK_WINDOW(caller);
    GtkFileChooserNative *native;
    GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
    gint res;

    native = gtk_file_chooser_native_new("Save File",
                                         parent_window,
                                         action,
                                         "_Save",
                                         "_Cancel");

    res = gtk_native_dialog_run(GTK_NATIVE_DIALOG(native));
    if (res == GTK_RESPONSE_ACCEPT)
    {
        char *filename;
        GtkFileChooser *chooser = GTK_FILE_CHOOSER(native);
        filename = gtk_file_chooser_get_filename(chooser);

        // save the file 
        save_to_file(filename);

        g_free(filename);
    }

    g_object_unref(native);
}

这里是一个例子,用<代码> *.CPP模式设置<代码> gtkFielFixs<代码>,以显示C++文件。它还将默认文档名设置为

test.cpp

使用:g++filechooser.cpp`pkg config--cflags gtk+-3.0``pkg config--libs gtk+-3.0编译`

#include <gtk/gtk.h>

static void dialog_result(GtkWidget *dialog, gint resp, gpointer data)
{
    if (resp == GTK_RESPONSE_OK) {
        // do nothing
    } else {
        gtk_widget_destroy(dialog);
    }
}

static void open_dialog(GtkWidget *button, gpointer window)
{
    GtkWidget *dialog;
    GtkFileFilter *filter;

    dialog = gtk_file_chooser_dialog_new("Choose a file:", GTK_WINDOW(window), 
                        GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE,
                         GTK_RESPONSE_OK, GTK_STOCK_CANCEL,
                         GTK_RESPONSE_CANCEL, NULL);

    filter = gtk_file_filter_new();
    gtk_file_filter_add_pattern(filter, "*.cpp");
    gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
    gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "test.cpp");
    gtk_widget_show_all(dialog);
    gint resp = gtk_dialog_run(GTK_DIALOG(dialog));
    if (resp == GTK_RESPONSE_OK)
        g_print("%s\n", gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
    else
        g_print("You pressed the cancel\n");
    gtk_widget_destroy(dialog);
}

int main()
{
    gtk_init(NULL, NULL);
    GtkWidget *window, *button;
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "delete_event", G_CALLBACK(gtk_main_quit), NULL);
    button = gtk_button_new_with_label("Save");
    g_signal_connect(button, "clicked", G_CALLBACK(open_dialog), window);
    gtk_container_set_border_width(GTK_CONTAINER(window), 100);
    gtk_container_add(GTK_CONTAINER(window), button);
    gtk_widget_show_all(window);
    gtk_main();
}
#包括
静态无效对话框\u结果(GtkWidget*对话框、gint resp、gpointer数据)
{
如果(resp==GTK_响应_正常){
//无所事事
}否则{
gtk_小部件_销毁(对话框);
}
}
静态无效打开_对话框(GtkWidget*按钮,gpointer窗口)
{
GtkWidget*对话框;
GtkFileFilter*过滤器;
dialog=gtk_文件\u选择器\u对话框\u新建(“选择文件:”,gtk_窗口(窗口),
GTK_文件_选择器_操作_保存,GTK_库存_保存,
GTK_响应_确定,GTK_库存_取消,
GTK_响应_取消,空);
filter=gtk_file_filter_new();
gtk_文件_过滤器_添加_模式(过滤器,*.cpp”);
gtk_文件选择器添加过滤器(gtk_文件选择器(对话框),过滤器);
gtk_文件选择器设置当前名称(gtk_文件选择器(对话框),“test.cpp”);
gtk_小部件_全部显示(对话框);
gint resp=gtk_对话框运行(gtk_对话框(对话框));
如果(resp==GTK_响应_正常)
g_print(“%s\n”,gtk_文件选择器_获取文件名(gtk_文件选择器(对话框));
其他的
g_print(“您按下了取消按钮”);
gtk_小部件_销毁(对话框);
}
int main()
{
gtk_init(NULL,NULL);
GtkWidget*窗口,*按钮;
窗口=gtk_窗口_新建(gtk_窗口_顶层);
g_信号连接(窗口,“删除事件”,g_回调(gtk_主退出),空);
按钮=gtk_按钮_新建_,带有标签(“保存”);
g_信号连接(按钮,“点击”,g_回调(打开对话框),窗口);
gtk_容器_设置_边框_宽度(gtk_容器(窗口),100);
gtk_容器添加(gtk_容器(窗口),按钮);
gtk_小部件_全部显示(窗口);
gtk_main();
}

以下是使用jackw11111的解决方案完成的GTK本机文件选择器的完整代码:

static void cb_SaveFileAs(GtkWidget *caller) // callback function
{
    GtkWindow *parent_window = GTK_WINDOW(caller); // assuming that the caller is GtkWindow
    GtkFileChooserNative *native;
    GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
    gint res;

    native = gtk_file_chooser_native_new("Save File",
                                         parent_window,
                                         action,
                                         "_Save",
                                         "_Cancel");

    // Filters
    filter = gtk_file_filter_new(); // filter 1
    gtk_file_filter_set_name(filter, "Project file");
    gtk_file_filter_add_pattern(filter, ".proj");
    gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter);
    filter = gtk_file_filter_new(); // filter 2
    gtk_file_filter_set_name(filter, "All files");
    gtk_file_filter_add_pattern(filter, "*");
    gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter);

    // default file name
    gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(native), "my_file_name");

    res = gtk_native_dialog_run(GTK_NATIVE_DIALOG(native));
    if (res == GTK_RESPONSE_ACCEPT)
    {
        char *filename;
        GtkFileChooser *chooser = GTK_FILE_CHOOSER(native);
        filename = gtk_file_chooser_get_filename(chooser);

        // save the file
        save_to_file(filename);

        g_free(filename);
    }

    g_object_unref(native);
}

它也适用于本机文件选择器。我不这么认为。但是对于原生选择器,KDEGood会出现焦点问题,谢谢。但是,我只在Windows上需要它。对于Linux/gtk上通过门户调用的本机文件选择器(所以从flatpak调用),这不适用于我。扩展过滤器被忽略。在主机上工作,不使用flatpakcode示例时是不完整的。是的,它是从我的函数中删除的唯一需要修改的片段。另一个代码太复杂了。但是出于教程的目的,我完成了示例中的代码,因此现在可以使用了。该函数是一个回调函数。