Jump to content

Qt for HarmonyOS/user development guide/how to use QOhosWant zh

From Qt Wiki

QOhosWant

中文 English

简介

QOhosWant 是 Qt 对 HarmonyOS Want 的封装,字段与原生 Want 一一对应:

  • deviceId
  • bundleName
  • moduleName
  • abilityName
  • uri
  • type
  • action
  • entities
  • flags
  • parameters
  • fds

其中 parameters 为完整的 Want 参数 QJsonObject,不会被框架改写

Want 获取

应用启动时(OnCreate)

auto wantInfo = QtOhosExtras::QOhosAppContext::getAppLaunchWantInfo();

运行中收到新 Want(onNewWant)

监听信号

QtOhosExtras::QOhosAbilityContext::newWantInfoReceived(QSharedPointer<QOhosWantInfo>)

从 QOhosWantInfo 调用 want()即可得到 QOhosWant。

读取 parameters

直接使用 Qt JSON API,从 QOhosWant::parameters(QJsonObject)访问:

auto params = want.parameters;

类型判断

  • isString()
  • isDouble()
  • isBool()
  • isArray()
  • isObject()

兼容字符串/数组

如果字段可能是数组,先用 isArray() 判断后再迭代 toArray(),或同时兼容字符串与数组:

auto toList = [](const QJsonValue &v) {
    if (v.isString()) return QStringList{v.toString()};
    if (v.isArray()) {
        QStringList out;
        for (const auto &item : v.toArray())
            if (item.isString()) out.append(item.toString());
        return out;
    }
    return QStringList{};
};
auto streams = toList(params.value("ability.params.stream"));

调试打印

QString json = QJsonDocument(params).toJson(QJsonDocument::Compact);

完整示例(最小日志窗口)

#include <QApplication>
#include <QJsonDocument>
#include <QScrollBar>
#include <QTextEdit>
#include <QtOhosExtras>

static QStringList tryExtractStreamParam(const QJsonObject &parameters) {
    auto toList = [](const QJsonValue &v) {
        if (v.isString()) return QStringList{v.toString()};
        if (v.isArray()) {
            QStringList out;
            for (const auto &item : v.toArray())
                if (item.isString()) out.append(item.toString());
            return out;
        }
        return QStringList{};
    };
    // 如果是非嵌套 key
    auto flat = toList(parameters.value("ability.params.stream"));
    if (!flat.isEmpty())
        return flat;
    // 如果是嵌套 key
    return toList(parameters.value("ability").toObject()
                           .value("params").toObject()
                           .value("stream"));
}

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    QTextEdit view;
    view.setReadOnly(true);
    view.setWindowTitle("Want Parameters Demo");

    auto logWant = [&](const char *tag, const QtOhosExtras::QOhosWant &want) {
        view.append(QStringLiteral("[%1] parameters: %2").arg(tag,
            QString::fromUtf8(QJsonDocument(want.parameters).toJson(QJsonDocument::Compact))));
        auto streams = tryExtractStreamParam(want.parameters);
        view.append(streams.isEmpty()
            ? QStringLiteral("[%1] ability.params.stream not found").arg(tag)
            : QStringLiteral("[%1] ability.params.stream: %2").arg(tag).arg(streams.join(", ")));
        view.verticalScrollBar()->setValue(view.verticalScrollBar()->maximum());
    };

    if (auto launch = QtOhosExtras::QOhosAppContext::getAppLaunchWantInfo())
        logWant("On Application Start", launch->want());

    auto ctx = QtOhosExtras::QOhosAbilityContext::instance();
    QObject::connect(ctx, &QtOhosExtras::QOhosAbilityContext::newWantInfoReceived,
        [&](auto wantInfo) {
            logWant("On New Want", wantInfo->want()); });

    view.show();
    return app.exec();
}

常见注意事项

  • parameters.value() 未命中时返回 QJsonValue::Undefined,访问前请检查类型。
  • 若发送方使用自定义 key,Qt 端保持原样;如需同时兼容非嵌套与嵌套结构,需自行判断。
  • 默认使用 QJsonValue::fromVariant() 进行转换;若数据类型不匹配,请自行处理。