Qt for HarmonyOS/qtohosextras doc/Serial Port Permissions Example - main.cpp
< 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();
}