Auf dieser Seite

Qt NFC Übersicht

Typische Anwendungsfälle der „ Qt NFC “-API sind:

  • Erkennen von NFC-Tags.
  • Lesen und Schreiben von NDEF-Nachrichten.
  • Registrieren von NDEF-Nachrichten-Handlern.
  • Austausch von Dateien und Nachrichten.

In den folgenden Abschnitten wird beschrieben, wie man die C++-Klassen und QML-Typen von „ Qt NFC “ für die oben genannten Anwendungsfälle einsetzt.

Hinweis: Unter Android funktioniert das Erkennen neuer NFC-Tags nur in Vordergrundanwendungen. Android-Dienste unterstützen dies aufgrund von API-Einschränkungen auf der Android-Seite nicht. Die einzige Möglichkeit, ein Tag in einem Dienst zu verwenden, besteht darin, eine AIDL-Schnittstelle bereitzustellen, die das Tag akzeptiert und es an Qt weiterleitet, wie im folgenden Beispiel gezeigt.

public void setTag(Tag pTag) {
    Intent newIntent = new Intent();
    newIntent.putExtra(NfcAdapter.EXTRA_TAG, pTag);
    QtNative.onNewIntent(newIntent);
}

C++-Übersicht

Die C++-API bietet Zugriff auf den gesamten Funktionsumfang der „ Qt NFC “-API. In diesem Abschnitt werden die wichtigsten Funktionen vorgestellt, die Entwicklern zur Verfügung stehen.

Erkennung von NFC-Tags

Die Klasse „ QNearFieldManager “ ist für die Erkennung neuer NFC-Tags zuständig, die in Reichweite des Geräts kommen. Die Signale „ QNearFieldManager::targetDetected()“ und „ QNearFieldManager::targetLost()“ werden ausgelöst, wenn ein Tag in Reichweite kommt oder diese verlässt. Der übergebene Parameter „ QNearFieldTarget “ dient als primärer Interaktionspunkt für jedes erkannte Tag. Die Erkennung beginnt jedoch erst, wenn „ QNearFieldManager::startTargetDetection()“ aufgerufen wurde.

m_manager = new QNearFieldManager(this);
connect(m_manager, &QNearFieldManager::targetDetected,
        this, &MainWindow::targetDetected);
connect(m_manager, &QNearFieldManager::targetLost,
        this, &MainWindow::targetLost);
m_manager->startTargetDetection(QNearFieldTarget::NdefAccess);

Schließlich kann die Erkennung beendet werden:

m_manager->stopTargetDetection();

Obwohl jede „ QNearFieldTarget “-Instanz von der zugehörigen „ QNearFieldManager “-Instanz verwaltet wird, kann es sinnvoll sein, jede Instanz manuell zu löschen. Andernfalls würden sie so lange bestehen bleiben, bis die „ QNearFieldManager “-Instanz gelöscht wird. Am besten geschieht dies als Reaktion auf das Signal „ QNearFieldManager::targetLost():“

void MainWindow::targetLost(QNearFieldTarget *target)
{
    target->deleteLater();
}

Hinweis: Das Zielobjekt sollte nur dann über `deleteLater()` gelöscht werden, wenn dies innerhalb des Slots geschieht.

NFC-Tags verbinden

Alle Funktionen von „ QNearFieldTarget “, die eine Verbindung erfordern, stellen diese selbstständig her. Eine aktive Verbindung verhindert, dass andere Instanzen eine Verbindung herstellen, da jeweils nur eine Verbindung zulässig ist.

In Qt 5 wurde die Verbindung zum Tag am Ende der Funktionen getrennt, um anderen Instanzen das Herstellen einer Verbindung zu ermöglichen. Mit QNearFieldManager::setKeepConnection() konnte dieses Verhalten geändert werden.

Seit Qt 6 hält „ QNearFieldTarget “ die Verbindung standardmäßig aufrecht. Die Verbindung wird erst geschlossen, wenn „ QNearFieldTarget “ zerstört wird oder „ QNearFieldManager::disconnect()“ aufgerufen wird.

Lesen und Schreiben von NDEF-Nachrichten

Die von ` QNearFieldManager::targetDetected()` zurückgegebene ` QNearFieldTarget `-Instanz wird zur Interaktion mit dem Tag verwendet. Das Lesen und Schreiben einer Nachricht ist ein asynchroner Vorgang. Die Klasse ` QNearFieldTarget::RequestId ` ordnet einzelne Operationen ihren Ergebnissen zu.

void MainWindow::targetDetected(QNearFieldTarget *target)
{
    switch (m_touchAction) {
    case NoAction:
        break;
    case ReadNdef:
        connect(target, &QNearFieldTarget::ndefMessageRead, this, &MainWindow::ndefMessageRead);
        connect(target, &QNearFieldTarget::error, this, &MainWindow::targetError);

        m_request = target->readNdefMessages();
        if (!m_request.isValid()) // cannot read messages
            targetError(QNearFieldTarget::NdefReadError, m_request);
        break;
    case WriteNdef:
        connect(target, &QNearFieldTarget::requestCompleted, this, &MainWindow::ndefMessageWritten);
        connect(target, &QNearFieldTarget::error, this, &MainWindow::targetError);

        m_request = target->writeNdefMessages(QList<QNdefMessage>() << ndefMessage());
        if (!m_request.isValid()) // cannot write messages
            targetError(QNearFieldTarget::NdefWriteError, m_request);
        break;
    }
}

Sobald die Anfrage „ QNearFieldTarget::readNdefMessages()“ erfolgreich verarbeitet wurde, wird das Signal „ QNearFieldTarget::ndefMessageRead()“ ausgelöst. Jede zurückgegebene „ QNdefMessage “-Instanz kann aus null oder mehr „ QNdefRecord “-Einträgen bestehen, die anhand ihres Typs identifiziert werden können. Weitere Informationen zur Verarbeitung von Datensätzen finden Sie in der Dokumentation zur Klasse „ QNdefRecord “. Wie der obige Code zeigt, wird das Schreiben von NDEF-Nachrichten über „ QNearFieldTarget::writeNdefMessages()“ ausgelöst. Der erfolgreiche Abschluss des Schreibvorgangs wird durch die Ausgabe des Signals „ QNearFieldTarget::requestCompleted()“ mit der entsprechenden Anforderungs-ID angezeigt. Jeder Fehlertyp beim Lesen oder Schreiben wird über „ QNearFieldTarget::error()“ gemeldet.

© 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.