Jump to content

Qt for HarmonyOS/qtohosextras doc/Serial Port Permissions Example - main.cpp

From Qt Wiki
Revision as of 02:50, 17 September 2026 by Shawn Luo (talk | contribs) (Publish example source listings and restore Files lists (QTFOROH-2307))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

< Qt for HarmonyOS / qtohosextras doc

Serial Port Permissions Example - main.cpp

 // Copyright (C) 2026 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 <QMessageBox>
 #include <QObject>
 #include <QPushButton>
 #include <QSerialPortInfo>
 #include <QString>
 #include <QVBoxLayout>
 #include <QWidget>
 #include <QtOhosExtras>

 namespace {

 class PermissionWindow : public QWidget
 {
 public:
     PermissionWindow(
         const QString &portName, QSharedPointer<QObject> serialPortAccessRightContext,
         QWidget *parent = nullptr);

 private:
     QSharedPointer<QObject> m_serialPortAccessRightContext;
 };

 PermissionWindow::PermissionWindow(
     const QString &portName, QSharedPointer<QObject> serialPortAccessRightContext, QWidget *parent)
     : QWidget(parent)
     , m_serialPortAccessRightContext(serialPortAccessRightContext)
 {
     setWindowTitle(QLatin1String("Serial Port Permission Window"));

     auto *layout = new QVBoxLayout(this);

     auto *portLabel = new QLabel(QLatin1String("Port: ") + portName);
     layout->addWidget(portLabel);

     auto *infoLabel = new QLabel(
         QLatin1String("Permission granted. Closing this window revokes the permission."));
     infoLabel->setWordWrap(true);
     layout->addWidget(infoLabel);
 }

 }

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

     QWidget mainWindow;
     mainWindow.setWindowTitle(QLatin1String("Serial port access permissions example"));

     auto *layout = new QVBoxLayout(&mainWindow);

     const auto ports = QSerialPortInfo::availablePorts();

     auto *portsInfoLabel = new QLabel(
         QLatin1String("Found ") + QString::number(ports.size()) + QLatin1String(" serial port(s)"));
     layout->addWidget(portsInfoLabel);

     for (const auto &port : ports) {
         const auto portName = port.portName();

         auto *rowLayout = new QHBoxLayout;

         auto *label = new QLabel(QLatin1String("Port: ") + portName);

         auto *requestButton = new QPushButton(QLatin1String("Request permission"));
         auto *checkButton = new QPushButton(QLatin1String("Check permission"));

         rowLayout->addWidget(label);
         rowLayout->addWidget(requestButton);
         rowLayout->addWidget(checkButton);

         layout->addLayout(rowLayout);

         QObject::connect(
             requestButton, &QPushButton::clicked, &mainWindow,
             [portName]() {
                 QtOhosExtras::QOhosAppContext::instance()->requestSerialPortAccessRightIfNeeded(portName);
             });

         QObject::connect(
             checkButton, &QPushButton::clicked, &mainWindow,
             [portName]() {
                 if (QtOhosExtras::QOhosAppContext::instance()->hasSerialPortAccessRight(portName)) {
                     QMessageBox::information(
                         nullptr, QLatin1String("Serial port permission"),
                         QLatin1String("Permission GRANTED for: ") + portName);
                 } else {
                     QMessageBox::warning(
                         nullptr, QLatin1String("Serial port permission"),
                         QLatin1String("Permission DENIED for: ") + portName);
                 }
             });

         QObject::connect(
             QtOhosExtras::QOhosAppContext::instance(),
             &QtOhosExtras::QOhosAppContext::serialPortAccessRightResponseReceived,
             &mainWindow,
             [portName](const QString &responsePortName, QSharedPointer<QObject> responseContext) {
                 if (responsePortName != portName) {
                     return;
                 }

                 if (responseContext != nullptr) {
                     auto *window = new PermissionWindow(portName, responseContext);
                     window->setAttribute(Qt::WA_DeleteOnClose);
                     window->resize(400, 200);
                     window->show();
                 } else {
                     QMessageBox::warning(
                         nullptr, QLatin1String("Serial port permission"),
                         QLatin1String("Permission DENIED for: ") + portName);
                 }
             });
     }

     mainWindow.resize(800, 400);
     mainWindow.show();

     return app.exec();
 }