Qt / QML:根据是否下载某些内容显示指标

时间:2015-01-28 14:25:43

标签: qt qml

我想知道对于以下情况可能是最好的方法:

我有一个QML文件,从HTTP服务器加载到Qt / QML安卓应用程序以显示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中显示/隐藏指标的最佳方法是什么?

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

这是我想到的,但我不认为这是最好的方法,因为我需要一个传递目录ID的方法来检查数据目录是否存在。此外,我必须找出一种方法来重新评估可见状态/不时调用catalogIsLoaded方法 - 尤其是在下载或删除目录之后。

对此有更好/更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

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

如果您希望通过其ID找到目录,请在“MyApp”类上提供一个可调用的方法以返回目录引用。

Q_INVOKABLE Catalog* findCatalogById(const QString& id);

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

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*>中),并在其状态更改时进行相应更新。