Qt for HarmonyOS/qtohosextras doc/Start Ability For Result Example - main.cpp
< Qt for HarmonyOS / qtohosextras doc
Start Ability For Result Example - main.cpp
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QApplication>
#include <QByteArray>
#include <QDialog>
#include <QFormLayout>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QMessageBox>
#include <QPushButton>
#include <QSharedPointer>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QWidget>
#include <QtOhosExtras>
#include <functional>
namespace {
class StartAbilityForResultDialog : public QDialog
{
public:
StartAbilityForResultDialog(QWidget *parent = nullptr);
QString bundleName() const;
QString abilityName() const;
private:
QLineEdit *m_bundleNameEdit;
QLineEdit *m_abilityNameEdit;
};
StartAbilityForResultDialog::StartAbilityForResultDialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("Enter Want Properties");
m_bundleNameEdit = new QLineEdit("com.start.ability.for.result.target", this);
m_abilityNameEdit = new QLineEdit("EntryAbility", this);
auto *layout = new QFormLayout(this);
layout->addRow("Bundle Name:", m_bundleNameEdit);
layout->addRow("Ability Name:", m_abilityNameEdit);
auto *buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
layout->addWidget(buttons);
}
QString StartAbilityForResultDialog::bundleName() const
{
return m_bundleNameEdit->text();
}
QString StartAbilityForResultDialog::abilityName() const
{
return m_abilityNameEdit->text();
}
QSharedPointer<QtOhosExtras::QOhosWant> tryGetWantFromTheUser()
{
StartAbilityForResultDialog dialog;
if (dialog.exec() == QDialog::Accepted) {
QtOhosExtras::QOhosWant want;
want.bundleName = dialog.bundleName();
want.abilityName = dialog.abilityName();
return QSharedPointer<QtOhosExtras::QOhosWant>::create(want);
}
return nullptr;
}
QPushButton *createTestButton(const QString &title, std::function<void()> callback)
{
auto *button = new QPushButton(title);
QObject::connect(button, &QPushButton::clicked, std::move(callback));
return button;
}
class SamplePresenterWidget : public QWidget
{
public:
SamplePresenterWidget(QWidget *parent = nullptr);
private:
void appendMessage(const QByteArray &requestId, const QString &status);
QTextEdit *m_textEdit;
};
SamplePresenterWidget::SamplePresenterWidget(QWidget *parent)
: QWidget(parent)
{
auto abilityContext = QtOhosExtras::QOhosAbilityContext::getDefaultInstance();
QObject::connect(
abilityContext.get(),
&QtOhosExtras::QOhosAbilityContext::startAbilityForResultResponseReceived,
this,
[this](auto requestId, auto resultCode, auto want) {
appendMessage(requestId, QStringLiteral("resultCode: %1").arg(resultCode));
QMessageBox::information(
nullptr, "Success",
QStringLiteral("The result code from started ability: %1, has want: %2, request id: %3")
.arg(resultCode)
.arg(want != nullptr)
.arg(requestId.toHex().constData()));
});
QObject::connect(
abilityContext.get(),
&QtOhosExtras::QOhosAbilityContext::startAbilityForResultErrorResponseReceived,
this,
[this](auto requestId) {
appendMessage(requestId, QStringLiteral("Error"));
QMessageBox::warning(
nullptr, "Error",
QStringLiteral("An error occurred while starting ability for result. Request id: %1")
.arg(requestId.toHex().constData())
);
});
auto *mainLayout = new QHBoxLayout(this);
auto *buttonsLayout = new QVBoxLayout();
mainLayout->addLayout(buttonsLayout);
buttonsLayout->addWidget(
createTestButton(
"Start Ability For Result - want only",
[this, abilityContext]() {
auto want = tryGetWantFromTheUser();
if (want) {
auto requestId = abilityContext->startAbilityForResult(*want.get());
appendMessage(requestId, QStringLiteral("sent"));
}
}));
buttonsLayout->addWidget(
createTestButton(
"Start Ability For Result - want & options",
[this, abilityContext]() {
auto want = tryGetWantFromTheUser();
if (want) {
auto startOptions = QtOhosExtras::createStartOptions();
startOptions->setWindowTop(0);
startOptions->setWindowLeft(0);
auto requestId = abilityContext->startAbilityForResult(
*want.get(), *startOptions.get());
appendMessage(requestId, QStringLiteral("sent"));
}
}));
buttonsLayout->addWidget(
createTestButton(
"Start Ability For Result - empty want",
[this, abilityContext]() {
auto requestId = abilityContext->startAbilityForResult(QtOhosExtras::QOhosWant());
appendMessage(requestId, QStringLiteral("sent"));
}));
auto *textLayout = new QVBoxLayout();
mainLayout->addLayout(textLayout);
m_textEdit = new QTextEdit();
m_textEdit->setReadOnly(true);
textLayout->addWidget(m_textEdit);
}
void SamplePresenterWidget::appendMessage(const QByteArray &requestId, const QString &status)
{
m_textEdit->append(
QStringLiteral("Request Id: %1 Status: %2")
.arg(requestId.toHex().constData())
.arg(status));
}
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
SamplePresenterWidget window;
window.show();
return app.exec();
}