【问题标题】:QML data folderQML 数据文件夹
【发布时间】:2014-12-07 06:33:53
【问题描述】:

我的应用基于QML,我使用Camera 和CameraCapture 从摄像头捕捉图像。捕获后,我想使用CameraCapture.captureToLocation() 将捕获的图像存储在应用程序数据文件夹中。但我不知道如何获取此文件夹的路径。所以我的问题-如何获得具有写入权限的应用程序文件夹的路径? Qt有没有办法得到它?我猜它应该是系统指定的文件夹。例如在 Android 中它应该是 /data/data/AppName。正如我所见,LocalStorage 在类似的地方创建它的文件。

【问题讨论】:

    标签: c++ qt qml qtcore qtmultimedia


    【解决方案1】:

    /data/data/AppName没有映射到QStandardPaths,不过我觉得还是用这个比较好:

    QStandardPaths::AppDataLocation 17 返回可以存储持久应用程序数据的目录位置。这是一个特定于应用程序的目录。要获取存储要与其他应用程序共享的数据的路径,请使用 QStandardPaths::GenericDataLocation。返回的路径永远不会为空。在 Windows 操作系统上,这将返回漫游路径。这个枚举值是在 Qt 5.4 中添加的。

    或早期版本中的这个:

    QStandardPaths::DataLocation 9 返回与 AppLocalDataLocation 相同的值。此枚举值已弃用。最好使用 AppDataLocation,因为在 Windows 上,建议使用漫游路径。

    这些将在 Android 上设置为 DataLocation "<APPROOT>/files", "<USER>/<APPNAME>/files"。

    但请注意,从 5.4 开始,后者已被弃用,如文档所述。您可以将其设置为follows:

    QString QStandardPaths::​writableLocation(StandardLocation 类型)

    返回类型文件应该写入的目录,如果位置无法确定,则返回空字符串。

    注意:返回的存储位置可以是不存在的目录;即,它可能需要由系统或用户创建。

    所以,你会这样写:

    QString dataPath = QStandardPaths::​writableLocation(QStandardPaths::AppDataLocation);
    // Do not need to check against empty string for this value as per documentatio
    CameraCapture.captureToLocation(dataPath);
    

    注意:请不要将QStandardPaths::ApplicationsLocation 用于此目的,因为那是非专用位置。此外,它甚至在 Android 上也不支持:

    ApplicationsLocation 不受支持(目录不可读)

    如果您想在应用程序之间共享图像,您需要对上面的代码稍作调整来使用它。虽然我认为你想要上面的那个,但有点不清楚你想要哪一个,所以我提到了两个:

    StandardPaths::GenericDataLocation 11 返回可以存储跨应用程序共享的持久数据的目录位置。这是一个通用值。返回的路径永远不会为空。

    在 Android 上设置为 GenericDataLocation "<USER>"。类文档中提到了确切的映射,您只需向下滚动到表格。我无法提供直接 URL,因为该部分没有永久链接。你也可以自己检查一下,哪个最合适。

    【讨论】:

    • 一如既往的好答案,lpapp,谢谢。加上我的两分钱,我个人发现自己对DownloadLocation 很满意。它在台式机和移动设备上回退到documents,我的用户感觉非常直观地连接移动设备并从其子目录中获取文件。不管怎样,我想我得去看看GenericDataLocation。
    • 首先,感谢@lpapp 提供如此详细的回答。我需要为应用程序指定的数据路径。所以我寻找了一些跨平台的解决方案,至少它应该可以在 Windows、Linux 和 Android 上运行。我已经测试了 GenericDataLocation 并且它指向系统数据文件夹,所以我只需将应用程序名称添加到此路径。当然,我创建了这个文件夹。
    • @folibis:我建议再次阅读文档。根据您的问题和此评论,GenericDataLocation 不是您想要的。你说你需要应用数据,那就是(App)DataLocation。从GenericDataLocation 自己构建完全没有意义。我觉得你很困惑。
    • 是的@lpapp,你是对的,再次阅读文档后,我认为DataLocation是我需要的。 Returns a directory location where persistent application data can be stored. This is an application-specific directory。所以我应该更仔细地阅读它
    • 顺便说一句,我在 Qt 5.3 中看不到 QStandardPaths::AppDataLocation。
    【解决方案2】:

    您可以使用QStandardPaths 指定可写位置:

    QString path = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) ;
    

    这里QStandardPaths::GenericDataLocation返回一个目录位置,可以存储跨应用程序共享的持久数据,并且永远不会为空。

    也可以使用QStandardPaths::ApplicationsLocation 或许多其他可以找到here。您可以在 C++ 端实现一个函数并在 QML 中使用它来获取标准位置。

    【讨论】:

    • 太棒了!谢谢,@Nejat 这正是我所需要的。
    • @folibis:你能透露一下你的逻辑吗? I've tested GenericDataLocation and it points to system data folder so I just add application name to this path 和 I need the data path specified for the application。即 (App)DataLocation,即为您预先创建的 GenericDataLocation + appname。您是说您拒绝使用 (App)DataLocation 并改用它吗?如果是这样,我觉得这不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多