【问题标题】:Qt/QML: Display an indicator depending on if something is downloaded or notQt/QML:根据是否下载内容显示指示器
【发布时间】:2015-01-28 14:25:42
【问题描述】:

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

我有一个 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 显示/隐藏指标的最佳方法是什么?

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

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

有没有更好/更清洁的方法?

【问题讨论】:

  • 什么是 MyApp ?您需要一个模型来存储此特定目录是否已下载。该模型可以有一个绑定到可见的 Q_PROPERTY(bool)。在下载目录时将该属性设置为 true。在删除文件时将其设置为 false(如果有的话)
  • 旁注:请注意,任何入侵您的 HTTP 的人都(至少)拥有对存储在用户设备上的任何文件 (mobilephonedevelopment.com/qt-qml-tips/#File%20Access) 的完全读取权限。您可能希望以更结构化的方式(例如 JSON)或更沙盒化的方式 (HTML) 获取数据

标签: qt qml


【解决方案1】:

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

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

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*> 中),并在其状态发生变化时相应地更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2011-04-21
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多