Jump to content

Qt for HarmonyOS/qtohosextras doc/Request Permission Example - main.cpp

From Qt Wiki
Revision as of 06:33, 17 September 2026 by Shawn Luo (talk | contribs) (Drop manual breadcrumb, MediaWiki renders it automatically (QTFOROH-2307))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Request Permission 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 <QHBoxLayout>
 #include <QLabel>
 #include <QLatin1String>
 #include <QList>
 #include <QMessageBox>
 #include <QPushButton>
 #include <QString>
 #include <QVBoxLayout>
 #include <QWidget>
 #include <QtOhosExtras>
 #include <functional>
 #include <utility>

 namespace {

 struct SupportedPermission {
     QString readableName;
     QtOhosExtras::AppPermissions::Permission permission;
     QString namedPermission;
 };

 static const QList<SupportedPermission> supportedPermissions = {
     {
         QLatin1String("Read pasteboard"),
         QtOhosExtras::AppPermissions::Permission::ReadPasteboard,
         QLatin1String("ohos.permission.READ_PASTEBOARD")
     },
     {
         QLatin1String("Custom screen capture"),
         QtOhosExtras::AppPermissions::Permission::CustomScreenCapture,
         QLatin1String("ohos.permission.CUSTOM_SCREEN_CAPTURE")
     },
     {
         QLatin1String("Access bluetooth"),
         QtOhosExtras::AppPermissions::Permission::AccessBluetooth,
         QLatin1String("ohos.permission.ACCESS_BLUETOOTH")
     },
     {
         QLatin1String("Approximate location"),
         QtOhosExtras::AppPermissions::Permission::ApproximatelyLocation,
         QLatin1String("ohos.permission.APPROXIMATELY_LOCATION")
     },
     {
         QLatin1String("Location"),
         QtOhosExtras::AppPermissions::Permission::Location,
         QLatin1String("ohos.permission.LOCATION")
     },
 };

 QString readableNameForPermission(QtOhosExtras::AppPermissions::Permission permission)
 {
     for (const auto &supportedPermission : supportedPermissions) {
         if (supportedPermission.permission == permission) {
             return supportedPermission.readableName;
         }
     }
     return {};
 }

 QString readableNameForNamedPermission(const QString &namedPermission)
 {
     for (const auto &supportedPermission : supportedPermissions) {
         if (supportedPermission.namedPermission == namedPermission) {
             return supportedPermission.readableName;
         }
     }
     return {};
 }

 QWidget *createActionButton(QString label, QWidget *parent, std::function<void()> action)
 {
     auto *button = new QPushButton(label, parent);
     QObject::connect(button, &QPushButton::clicked, parent, std::move(action));
     return button;
 }

 QSharedPointer<QtOhosExtras::QOhosAbilityContext> tryGetAbilityContext(QWidget *window)
 {
     auto *qWindow = window->windowHandle();
     return qWindow != nullptr
         ? QtOhosExtras::QOhosAbilityContext::getInstanceForMainWindow(qWindow)
         : nullptr;
 }

 QWidget *createWindowWithRequestPermissionButtons()
 {
     auto *window = new QWidget();
     window->setMinimumSize({640, 480});

     QVBoxLayout *layout = new QVBoxLayout(window);

     for (const auto &supportedPermission : supportedPermissions) {
         auto *horizontalLayout = new QHBoxLayout();
         horizontalLayout->addWidget(new QLabel(supportedPermission.readableName, window));
         horizontalLayout->addWidget(
             createActionButton(
                 QLatin1String("Enum based request"), window,
                 [window, supportedPermission]() {
                     auto abilityContext = tryGetAbilityContext(window);
                     if (abilityContext != nullptr) {
                         abilityContext->requestPermissionFromUserIfNeeded(
                             supportedPermission.permission);
                     }
                 }));
         horizontalLayout->addWidget(
             createActionButton(
                 QLatin1String("Named request"), window,
                 [window, supportedPermission]() {
                     auto abilityContext = tryGetAbilityContext(window);
                     if (abilityContext != nullptr) {
                         abilityContext->requestPermissionFromUserIfNeeded(
                             supportedPermission.namedPermission);
                     }
                 }));
         layout->addLayout(horizontalLayout);
     }

     window->setLayout(layout);

     return window;
 }

 void showAppPermissionResponseDialog(
     QWidget *parent, const QString &requestType, const QString &readablePermissionName,
     QtOhosExtras::AppPermissions::PermissionResult result)
 {
     QStringList messages;
     messages.append(QLatin1String("Permission: ") + readablePermissionName);
     messages.append(
         result.permissionGranted
             ? QLatin1String("Permission granted.")
             : QLatin1String("Permission not granted."));
     messages.append(
         result.dialogShown
             ? QLatin1String("Dialog shown.")
             : QLatin1String("Dialog not shown."));

     QMessageBox::information(
         parent, requestType + QLatin1String(" permission request response"),
         messages.join(QLatin1String("\n")));
 }

 }

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

     QWidget window;
     window.setWindowTitle(QLatin1String("Requesting application permissions from main windows"));

     QVBoxLayout *layout = new QVBoxLayout(&window);
     layout->addWidget(
         createActionButton(
             QLatin1String("Open new Main Window"), &window,
             []() {
                 auto *newWindow = createWindowWithRequestPermissionButtons();
                 newWindow->show();

                 auto abilityContext = QtOhosExtras::QOhosAbilityContext::getInstanceForMainWindow(newWindow->windowHandle());
                 QObject::connect(
                     abilityContext.data(),
                     &QtOhosExtras::QOhosAbilityContext::permissionRequestResponseReceived,
                     newWindow,
                     [newWindow](
                         QtOhosExtras::AppPermissions::Permission permission,
                         QtOhosExtras::AppPermissions::PermissionResult result) {
                         showAppPermissionResponseDialog(
                             newWindow, QLatin1String("Enum based"),
                             readableNameForPermission(permission),
                             result);
                     });
                 QObject::connect(
                     abilityContext.data(),
                     &QtOhosExtras::QOhosAbilityContext::namedPermissionRequestResponseReceived,
                     newWindow,
                     [newWindow](
                         const QString &permissionName,
                         QtOhosExtras::AppPermissions::PermissionResult result) {
                         showAppPermissionResponseDialog(
                             newWindow, QLatin1String("Named"),
                             readableNameForNamedPermission(permissionName),
                             result);
                     });
             }));
     window.setLayout(layout);
     window.show();

     return app.exec();
 }