跨平台原生打开/保存文件对话框

29
我正在使用Lua和C ++结合的OpenGL和SDL编写程序的UI界面。
现在我需要一个库,允许我调用一个函数来呈现打开/保存文件的文件选择对话框。但如果操作系统提供了原生功能的话,那么我想要使用该对话框(例如Windows的GetOpenFileName)。
我只需要支持Windows和Linux平台,但我想仍然能够使用我已经编写的大部分SDL和OpenGL代码。
有哪些可选项?

2
如果你只需要两个平台,而且每个平台的代码都很简单明了,为什么不直接创建两个分别针对某个平台的方法,并调用相应的方法呢? - rid
1
@hans Passant:什么是“购物问题”? - Bryan Oakley
@Bryan: http://blog.stackoverflow.com/2010/11/qa-is-hard-lets-go-shopping/ - André Caron
3
@Bryan:“我想买一匹小马,它必须是免费的,并且只需要一捆稻草就能跑100英里。当你找到一匹时,我可以随意拒绝它,因为我忘了说它还需要一根角。” 这是一个购物问题。 - Hans Passant
我为此编写了 https://github.com/AndrewBelt/osdialog。 - Vortico
6个回答

62
tinyfiledialogs 提供了许多模态对话框和弹出通知(适用于图形和控制台模式)。它是一个跨平台的单个 C 文件(+头文件),可添加到您的 C 或 C++ 项目中。它旨在非常易于使用,没有初始化、主循环或外部依赖。它被 GitHub 上的数百个项目使用,当然,我是作者。在这里获取它:http://tinyfiledialogs.sourceforge.net 使用示例:
    char const * selection = tinyfd_openFileDialog( // there is also a wchar_t version
        "Select file", // title
        "C:\\", // optional initial directory
        2, // number of filter patterns
        lFilterPatterns, // char const * lFilterPatterns[2] = { "*.txt", "*.jpg" };
        NULL, // optional filter description
        0 // forbid multiple selections
        );


tinyfiledialogs在Windows和Unix上将char字符串作为UTF-8处理。在Windows上,它还提供UTF-16 / wchar_t函数。
*** v3.10(2023年):全新的Fortran模块已完全实现,并附带示例 ***
*** v3.13(2023年):全新的Pascal单元已完全实现,并附带示例 ***
*** v3.14(2023年):全新的R接口已完全实现,并附带示例 ***

1
抱歉有点烦人,但我快速浏览了一下,它看起来很棒。我没有在源代码中看到许可证。我可以随意使用吗? - Michael
3
这是一个 zlib 许可证(许可证位于源代码和头文件的顶部)。 - tinyfiledialogs
2
虽然我不会这样做,但我感到有必要进行负面评价,因为你的SoureForge链接将人们带到这里进行烦人和无耻的投票,而不是简单地提供代码。因此,我将继续寻找其他替代方案,并给予上面答案的点赞。 - ForeverZer0
我知道这是一个旧评论,但它可能会帮助到某个人。@ohthepain 我也遇到了同样的问题,但在浏览示例后,我意识到过滤器需要指定为 *.<文件扩展名> 而不仅仅是扩展名本身。 - MG lolenstine
https://github.com/LWJGL/lwjgl3/blob/master/modules/lwjgl/tinyfd/src/main/c/tinyfiledialogs.c - undefined
显示剩余8条评论

36
你应该仔细查看 Native File Dialog。它是一个小型、可移植的C库,可以让你在跨平台方式下使用加载和保存对话框,而无需链接巨大的依赖项,如qt或wxWidgets。

我是这个库的作者,并且我在Linux、Mac和Windows上使用它来配合SDL2和OpenGL。

https://github.com/mlabbe/nativefiledialog


2
哇,那看起来棒极了。支持Win/OSX/Linux和gcc/clang/VS,UTF-8编码,没有其他依赖项,最重要的是,采用友好的 Zlib 许可证?太不可思议了! - Ponkadoodle
在2019年:我已经更新了库,以兼容最近的操作系统更新并修复了一些错误。如果您之前使用过它,只需重新编译即可获得好处!没有API更改。 - Michael Labbé
我已经维护了一个替代品 https://github.com/AndrewBelt/osdialog 几年了。它类似,但有其他对话框,如消息/提示和颜色选择器。 - Vortico
有一个基于你们的 native File dialog extended 库的扩展版本 (https://github.com/btzy/nativefiledialog-extended) 。 - X.Arthur

8
在我看来,wxWidgets 是一款开源、经过实战检验、成熟、跨平台、跨语言、免费、开源的GUI库。除了wxWidgets,还有许多其他类似的跨平台库,例如:

...等等。

您最可能在AbiWord源代码中找到所需内容。请在src目录中查找“FileOpen”:

./af/xap/cocoa/xap_CocoaDlg_FileOpenSaveAs.cpp
./af/xap/cocoa/xap_CocoaDlg_FileOpenSaveAs.h
./af/xap/cocoa/xap_CocoaFileOpen_Views.nib
./af/xap/cocoa/xap_CocoaFileOpen_Views.nib/classes.nib
./af/xap/cocoa/xap_CocoaFileOpen_Views.nib/info.nib
./af/xap/cocoa/xap_CocoaFileOpen_Views.nib/keyedobjects.nib
./af/xap/gtk/xap_UnixDlg_FileOpenSaveAs.cpp
./af/xap/gtk/xap_UnixDlg_FileOpenSaveAs.h
./af/xap/win/xap_Win32Dlg_FileOpenSaveAs.cpp
./af/xap/win/xap_Win32Dlg_FileOpenSaveAs.h
./af/xap/xp/xap_Dlg_FileOpenSaveAs.cpp
./af/xap/xp/xap_Dlg_FileOpenSaveAs.h

Windows版本确实使用GetOpenFileName()


当然,正如Andre在否定一个有效的备选答案时指出的那样,还有Qt,你已经知道了。请参考raj的回答获取链接。


18
您忘记了Qt,这是可以说是开源中经过实战验证的成熟的GUI库。 - André

5

QFileDialog 提供了一个好的操作系统文件打开服务的抽象。


我可能误读了这个,但似乎我必须购买Qt的商业许可证,而我更喜欢免费的东西。 - Ponkadoodle
4
不一定正确。自Qt 4.x起,其已采用LGPL许可证。这基本上意味着你可以在商业产品中动态链接Qt库。 - André

1

0

我为本地对话框开发了自己的 C 库。它可以在 Windows、macOS 和 Linux 上运行,并提供各种对话框。如果你正需要这样的功能,它应该可以胜任。点击这里查看代码库。


它支持打开文件对话框吗? - George Shalvashvili
是的,它可以用于保存和打开文件。 - AggelosT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接