GTK&x2B;3本机文件选择器-允许的文件类型和默认文件名 >我使用GTK+创建一个C++程序。为了选择文件,我使用了本机文件选择器,因为gtk文件选择器存在内存泄漏
我的问题是:如何在GTK+中为本机文件选择器(保存时)设置默认文件名,以及如何为其设置文件过滤器,以便仅打开或保存特定的文件扩展名 我的程序在Win32上运行。 示例代码: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
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示例时是不完整的。是的,它是从我的函数中删除的唯一需要修改的片段。另一个代码太复杂了。但是出于教程的目的,我完成了示例中的代码,因此现在可以使用了。该函数是一个回调函数。