C++ 跨平台本机打开/保存文件对话框

C++ 跨平台本机打开/保存文件对话框,c++,user-interface,dialog,cross-platform,native,C++,User Interface,Dialog,Cross Platform,Native,我正在使用opengl和SDL,结合Lua和C,为我的程序编写一个UI++ 我现在需要的是一个库,它允许我调用一个函数,为用户提供一个文件选择对话框,用于打开/保存文件。但是如果操作系统为这样一个对话框提供了本机功能,那么我想使用该对话框(例如窗口的GetOpenFileName) 我需要支持的平台只有Windows和Linux,但我希望仍然能够使用我已经编写的大部分SDL和openGL代码 可用的选项有哪些?提供了操作系统文件开放服务的一个很好的抽象概念在我看来,它是一个开源的、经过战斗考验的

我正在使用opengl和SDL,结合Lua和C,为我的程序编写一个UI++

我现在需要的是一个库,它允许我调用一个函数,为用户提供一个文件选择对话框,用于打开/保存文件。但是如果操作系统为这样一个对话框提供了本机功能,那么我想使用该对话框(例如窗口的GetOpenFileName)

我需要支持的平台只有Windows和Linux,但我希望仍然能够使用我已经编写的大部分SDL和openGL代码

可用的选项有哪些?

提供了操作系统文件开放服务的一个很好的抽象概念

在我看来,它是一个开源的、经过战斗考验的、成熟的、跨平台的、跨语言的、免费的、开源的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()



当然,正如在否决一个有效的备选答案时指出的,还有Qt,正如您已经知道的。有关链接,请参阅。

您应该仔细查看。它是一个小型的、可移植的C库,允许您以跨平台的方式使用加载和保存对话框,而无需链接qt或wxWidgets等大型依赖项

我是作者,我在Linux、Mac和Windows上与SDL2和OpenGL一起使用它

提供了许多模式对话框和弹出式通知(用于图形和控制台模式)。它是一个跨平台的C文件(带有标题),添加到C或C++项目中。它的目标是非常易于使用,没有init,没有主循环,也没有外部依赖。GitHub上的数百个项目都在使用它,当然,我是作者。在这里获取:

用法示例:

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


如果您只需要两个平台,并且每个平台的代码都简单明了,为什么不简单地使用两个单独的方法,每个方法针对某个平台,并调用相应的方法?@hans Passant:什么是“购物问题”@Bryan:@Bryan:“我想买一匹小马。它必须是免费的,用一捆稻草跑100英里。当你找到一个,我可以任意拒绝它,因为我忘了说它需要一个喇叭“。这是一个购物问题。我写这篇文章就是为了这个目的。我可能误读了这篇文章,但似乎我必须购买许可证才能在商业上使用Qt,我更喜欢免费的东西。这不一定是真的。”。从Qt4.0开始,它就拥有LGPL许可证。这基本上意味着您可以在商业产品中动态链接Qt。您忘记了Qt,它可以说是经过开源测试的成熟产品。。。GUI库。哇,看起来棒极了。Win/OSX/Linux&gcc/clang/VS支持,UTF-8,没有其他依赖项,最重要的是,一个友好的Zlib许可证?难以置信的2019年的今天:我更新了该库,使其与最近的操作系统更新兼容,并修复了一些bug。如果您以前使用过它,只需重新编译它,您将获得好处!没有api更改。我已经维护了一个替代方案好几年了。它类似,但有其他对话框,如消息/提示和颜色选择器。有一个基于您的
本机文件对话框扩展的
()库。很抱歉打扰您,但我快速查看了一下,它看起来棒极了。我没有看到源代码中包含许可证。我可以用它做任何我想做的事吗?这是一个zlib许可证(许可证在源文件和头文件的顶部)。太棒了!谢谢。在我的Fortran软件中,我需要一个打开/保存弹出窗口的windows例程,我找到了tinyfiledialog,并设法编写了一个iso-c接口,在windows gfortran上运行良好。我在将它移植到Linux时遇到了一些问题,但我从作者那里得到了一些非常有用的帮助。我正在macOS上试用它。我无法使用它打开文件进行读取。具有选定扩展名的所有文件都将灰显。