Qt for HarmonyOS/user development guide/how to use QOhosWant zh
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 ¶meters) {
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() 进行转换;若数据类型不匹配,请自行处理。