Qt/QML:根据是否下载内容显示指示器

Qt/QML: Display an indicator depending on if something is downloaded or not

我想知道以下情况的最佳方法是什么:

我有一个 QML 文件,它从 HTTP 服务器加载到 Qt/QML android 应用程序以显示 UI。

用户可以点击目录的缩略图,让应用程序为每个目录下载另一个 QML 文件。目录 QML 已下载并存储在设备上以供离线使用。

这意味着我有许多具有唯一 ID 的目录来存储目录 QML 和资产。像这样:

/my/app_data_path/catalogs/CATALOG_001
/my/app_data_path/catalogs/CATALOG_007
/my/app_data_path/catalogs/CATALOG_010

在 UI 中,我想显示一个指示器,指示是否已将目录下载到设备。 QML 中 show/hide 指标的最佳方法是什么?

Rectangle { 
    id: indicator
    visible: MyApp.catalogIsLoaded('some ID here') 
}

这是我的想法,但我认为这不是最好的方法,因为我需要一种方法来传递目录 ID 以检查数据目录是否存在。此外,我还必须想出一种方法来不时地重新评估可见的 state/call catalogIsLoaded 方法 - 特别是在下载或删除目录之后。

是否有 better/cleaner 方法?

更好的方法是将指标可见性与 属性 绑定相关联。

如果您希望通过 ID 查找目录,请在 'MyApp' class 上提供一个可调用方法以 return 目录引用。

Q_INVOKABLE Catalog* findCatalogById(const QString& id);

Catalog 将是一个 QObject,向 QML 公开一个 isLoaded 属性。

class Catalog : public QObject {
    Q_OBJECT
    Q_PROPERTY(bool isLoaded READ isLoaded NOTIFY isLoadedChanged)

    public:
    Catalog(QObject* parent = 0) : QObject(parent) {
    }

    bool isLoaded() const { return m_isLoaded; }
    void setIsLoaded(bool loaded) {
        if (m_isLoaded != loaded) {
            m_isLoaded = loaded;
            emit isLoadedChanged();
        }
    }

signals:
    void isLoadedChanged();

private:
    bool m_isLoaded; //should probably be initialized to false
};

当然,您的上下文提供的目录参考应该记住某处(比如在 QHash<QString, Catalog*> 中),并在其状态更改时相应地更新。