【问题标题】:GTK+ 3 native file chooser - allowed file types and default file nameGTK+ 3 原生文件选择器 - 允许的文件类型和默认文件名
【发布时间】:2019-07-23 21:14:01
【问题描述】:

我正在使用 GTK+ 创建一个 C++ 程序。为了选择文件,我使用了本机文件选择器,因为 gtk 文件选择器存在内存泄漏。

这是我的问题:如何为 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);
}

【问题讨论】:

  • 代码示例不完整。
  • 是的,它是从我的函数中删除的,作为唯一需要修改的片段。另一个代码太复杂了。但是出于教程目的,我完成了示例中的代码,因此它现在可以工作了。该函数是一个回调函数。

标签: c++ gtk gtk3 filechooser


【解决方案1】:

这是一个使用*.cpp 模式设置GtkFileFilter 以仅显示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();
}

【讨论】:

  • 它也适用于本机文件选择器。我不认为。
  • 但是使用原生选择器,在 KDE 中会出现焦点问题
  • 很高兴知道,谢谢。但是我只在 Windows 上需要它。
  • 对于通过门户调用的 Linux/gtk 上的本机文件选择器(因此来自 flatpak),这对我不起作用。扩展过滤器被简单地忽略。在不使用 flatpak 时在主机上工作
【解决方案2】:

这里是 GTK 原生文件选择器的完整代码,使用 jackw11111 的解决方案完成:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多