Auf dieser Seite

MQTT-Abonnements

Erstellen einer Anwendung, die mit einem MQTT-Broker kommuniziert.

Hauptfenster mit Steuerelementen für Verbindung und Veröffentlichung sowie zwei Abonnementfenstern, in denen die empfangenen Nachrichten zu „qtmqtt/topic1“ angezeigt werden

„MQTT-Abonnements“ zeigt, wie Sie eine Anwendung erstellen, die mit einem MQTT-Broker kommuniziert. Für jedes Abonnement öffnet sich ein neues Dialogfenster, in dem Sie die Nachrichten zu den abonnierten Themen sehen können.

Erstellen eines Clients

Wir verwenden die Klasse „ QMqttClient “, um einen MQTT-Client zu erstellen und den Hostnamen sowie den Port des Brokers festzulegen, die für die Verbindung verwendet werden sollen:

    m_client = new QMqttClient(this);
    m_client->setHostname(ui->lineEditHost->text());
    m_client->setPort(static_cast<quint16>(ui->spinBoxPort->value()));

Themen abonnieren

Wenn Benutzer im Client Themen abonnieren, wird ein neues Abonnementobjekt erstellt:

void MainWindow::on_buttonSubscribe_clicked()
{
    auto subscription = m_client->subscribe(ui->lineEditTopic->text(),
                                            static_cast<quint8>(ui->spinQoS->text().toUInt()));
    if (!subscription) {
        QMessageBox::critical(this, u"Error"_s,
                              u"Could not subscribe. Is there a valid connection?"_s);
        return;
    }
    auto subWindow = new SubscriptionWindow(subscription);
    subWindow->setWindowTitle(subscription->topic().filter());
    subWindow->show();
}

Wir verwenden die Klasse „ QMqttSubscription “, um das Thema, den Status und die QoS-Stufe eines Abonnements zu speichern:

SubscriptionWindow::SubscriptionWindow(QMqttSubscription *sub, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SubscriptionWindow),
    m_sub(sub)
{
    ui->setupUi(this);

    ui->labelSub->setText(m_sub->topic().filter());
    ui->labelQoS->setText(QString::number(m_sub->qos()));
    updateStatus(m_sub->state());
    connect(m_sub, &QMqttSubscription::messageReceived, this, &SubscriptionWindow::updateMessage);
    connect(m_sub, &QMqttSubscription::stateChanged, this, &SubscriptionWindow::updateStatus);
    connect(m_sub, &QMqttSubscription::qosChanged, [this](quint8 qos) {
        ui->labelQoS->setText(QString::number(qos));
    });
    connect(ui->pushButton, &QAbstractButton::clicked, m_sub, &QMqttSubscription::unsubscribe);
}

Die QoS-Stufe kann separat für eine Nachricht und für ein Abonnement festgelegt werden. Die für ein Abonnement festgelegte QoS-Stufe bestimmt die Mindest-QoS-Stufe. Wird eine Nachricht mit einer höheren QoS-Stufe gesendet, erhöht der Broker die QoS dieser Nachricht auf die höhere Stufe. Wenn beispielsweise Client A das Thema mit QoS 1 abonniert hat und Client B eine Nachricht mit QoS 0 auf diesem Thema veröffentlicht, erhöht der Broker automatisch die QoS der Nachricht auf 1. Veröffentlicht Client B eine Nachricht zu diesem Thema mit QoS 2, versendet der Broker sie mit QoS 2.

Empfangen von Nachrichten

Wenn der Client eine Nachricht empfängt, wird die Klasse ` QMqttMessage ` verwendet, um die eigentliche Nachrichtennutzlast zu speichern:

void SubscriptionWindow::updateMessage(const QMqttMessage &msg)
{
    ui->listWidget->addItem(msg.payload());
}

Dateien:

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.