我希望在我的应用程序中有一个按钮,允许用户从应用程序的特殊文档目录中打开文件。我以为我可以使用
initial-folder
属性来设置它,但我找不到一种方法来使用它来完成我想要的事情。这是一个没有达到我预期的最小示例:
import Control.Concurrent
import GI.Gtk
import GI.Gio hiding (Application)
main :: IO ()
main = do
app <- new Application []
onApplicationActivate app $ do
dlg <- new FileDialog [fileDialogInitialFolder :=> fileNewForPath "/"]
fileDialogOpen dlg (Nothing :: Maybe Window) (Nothing :: Maybe Cancellable) Nothing
applicationRun app Nothing
threadDelay 3000000
(最后的
threadDelay
只是为了让应用程序运行足够长的时间来查看对话框;除了 gtk 本身正在执行的操作之外,这里没有实际的多线程处理。)
我希望这会打开一个从
/
目录开始的对话框;但它是从 /home/<my-username>
开始的。我可以验证 fileNewForPath
确实创建了一个嵌入了正确路径的 File
对象:使用 /
之外的各种选择,路径的检索和后续打印确实与我发送的参数匹配。但对话框不会改变它的开始位置。
我做错了什么?我应该如何指示对话框从哪里开始?
为了使此示例完整且独立,这里有一个可用于构建此示例的最小 cabal 文件:
cabal-version: 3.0
name: test
version: 0.1.0.0
executable test
main-is: Main.hs
build-depends: base ^>=4.17.2.0, gi-gtk ^>=4.0, gi-gio ^>=2.0
这是一个具有基本相同行为的 C 版本(最多一个额外的空白窗口 - 不确定为什么在 C 版本中需要这个,但如果没有它,对话框似乎不会出现)。
#include <gio/gio.h>
#include <gtk/gtk.h>
void activate(GtkApplication *app, gpointer _unused) {
GtkWidget *window = gtk_application_window_new(app);
GtkFileDialog *dlg = gtk_file_dialog_new();
GFile *fnm = g_file_new_for_path("/");
gtk_file_dialog_set_initial_folder(dlg, fnm);
gtk_file_dialog_open(dlg, NULL, NULL, NULL, NULL);
gtk_window_present(GTK_WINDOW(window));
}
int main(int argc, char **argv) {
GtkApplication *app = gtk_application_new("x.x", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return 0;
}
编译并运行:
gcc $(pkg-config --cflags gtk4) -o test test.c $(pkg-config --libs gtk4)
./test
由于我只使用 C 语言,所以我只能用该语言回答。
以下代码行对我有用:
GtkFileDialog *dlg = gtk_file_dialog_new();
// GFile *fnm = g_file_new_for_path(NULL);
GFile *fnm = g_file_new_build_filename("/",NULL);
gtk_file_dialog_set_initial_folder(dlg, fnm);
致以诚挚的问候