【问题标题】:cross platform native open/save file dialogs跨平台原生打开/保存文件对话框
【发布时间】:2011-09-03 00:09:09
【问题描述】:

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

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

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

有哪些选择?

【问题讨论】:

  • 如果您只需要两个平台并且每个平台的代码都简单明了,为什么不简单地为某个平台设置两个单独的方法,然后调用相应的方法?
  • @hans Passant:什么是“购物问题”?
  • @Bryan:“我想买一匹小马,一定是免费的,一包稻草可以跑100英里。你找到了,我可以任意拒绝,因为我忘了说它需要一个喇叭”。这是一个购物问题。
  • 为此我写了github.com/AndrewBelt/osdialog

标签: c++ user-interface dialog cross-platform native


【解决方案1】:

https://doc.qt.io/qt-5/qfiledialog.html提供了很好的os文件打开服务抽象

【讨论】:

  • 我可能误读了这个,但看来我必须购买许可证才能在商业上使用 Qt,而且我更喜欢免费的东西。
  • 不一定正确。由于 Qt 4.something 它具有 LGPL 许可证。这基本上意味着您可以在商业产品中动态链接 Qt。
【解决方案2】:

在我看来,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's answer 获取链接。

【讨论】:

  • 你忘记了 Qt,它可以说是经过开源战斗测试成熟的... GUI 库。
【解决方案3】:

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

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

https://github.com/mlabbe/nativefiledialog

【讨论】:

  • 哇,看起来棒极了。 Win/OSX/Linux & gcc/clang/VS 支持,UTF-8,没有其他依赖,最重要的是,一个友好的 Zlib 许可证?难以置信!
  • 2019 年:我更新了库以兼容最近的操作系统更新并修复了一些错误。如果您以前使用它,只需重新编译它,您将获得好处!没有 API 更改。
  • 几年来我一直在维护一个替代github.com/AndrewBelt/osdialog。它很相似,但还有其他对话框,例如消息/提示和颜色选择器。
  • 有一个基于你的native File dialog extended (github.com/btzy/nativefiledialog-extended) 库。
【解决方案4】:

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

【讨论】:

  • 抱歉打扰了,但我快速浏览了一下,它看起来很棒。我没有看到源代码中包含许可证。我可以随心所欲吗?
  • 这是一个 zlib 许可证(许可证位于源文件和头文件的顶部)。
  • 太棒了!谢谢。
  • 我需要在我的 Fortran 软件中打开/保存弹出窗口例程,我找到了 tinyfiledialog 并设法编写了一个在 WIndows gfortran 上运行良好的 iso-c 接口。我在将它移植到 Linux 时遇到了一些问题,但我从作者那里得到了一些非常有用的帮助。
  • 我正在 macOS 上试用它。我不能用它来打开文件进行读取。具有选定扩展名的所有文件都显示为灰色。
【解决方案5】:

我使用了另一个不错的库:

https://github.com/samhocevar/portable-file-dialogs

它是一个支持 Linux / Mac / Windows 的单一头库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多