如何为文件打开对话框设置初始文件夹?

问题描述 投票:0回答:1

我希望在我的应用程序中有一个按钮,允许用户从应用程序的特殊文档目录中打开文件。我以为我可以使用

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 haskell gtk gtk4
1个回答
0
投票

由于我只使用 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);

致以诚挚的问候

© www.soinside.com 2019 - 2024. All rights reserved.