Kommentierte URL
Liest formatierte Nachrichten im NFC Data Exchange Format (NDEF).
Das Beispiel „Annotierte URL“ verwendet Qt NFC , um den Inhalt von speziell formatierten NFC-Datenaustauschformat-Nachrichten (NDEF) anzuzeigen, die von einem NFC-Tag gelesen wurden. Die NDEF-Nachricht sollte einen URI-Datensatz, einen optionalen MIME-Datensatz „ image/* “ sowie einen oder mehrere lokalisierte Text-Datensätze enthalten.
Dies ist der Ausgangszustand des Beispiels:

Wenn ein Tag berührt wird, wird dessen NDEF-Inhalt angezeigt. Hier ist die Benutzeroberfläche für ein Tag, das einen Textdatensatz und einen URI-Datensatz enthält:

Wenn auf den Bildschirm getippt wird, wird die URL im Browser geöffnet.
Klassendefinition von „AnnotatedUrl“
Die Klasse „ AnnotatedUrl “ umschließt „ QNearFieldManager “, die Klasse, die die NFC-Tag-Erkennungsfunktionalität bereitstellt. NDEF-Nachrichten werden von „ QNearFieldManager “ gelesen und an einen in der Klasse „ AnnotatedUrl “ enthaltenen Handler weitergeleitet. Nach dem Parsen der NDEF-Nachricht sendet die Klasse das Signal „ annotatedUrl() “ aus. Die Benutzeroberfläche reagiert auf das Signal und zeigt den Inhalt der NDEF-Nachricht an.
class AnnotatedUrl : public QObject
{
Q_OBJECT
public:
explicit AnnotatedUrl(QObject *parent = 0);
~AnnotatedUrl();
void startDetection();
signals:
void annotatedUrl(const QUrl &url, const QString &title, const QPixmap &pixmap);
void nfcStateChanged(bool enabled);
void tagError(const QString &error);
public slots:
void targetDetected(QNearFieldTarget *target);
void targetLost(QNearFieldTarget *target);
void handleMessage(const QNdefMessage &message, QNearFieldTarget *target);
void handlePolledNdefMessage(QNdefMessage message);
void handleAdapterStateChange(QNearFieldManager::AdapterState state);
private:
QNearFieldManager *manager;
QNdefFilter messageFilter;
};Hinweis: Die Methode „ startDetection() “ wird verwendet, um die eigentliche Tag-Erkennung aufzuschieben, bis alle Verbindungen zwischen der Benutzeroberfläche und der NFC-bezogenen Logik hergestellt sind. Dies ist wichtig, wenn die Anwendung automatisch gestartet wird, sobald ein NFC-Tag berührt wird. Ein solcher Anwendungsfall wird derzeit auf Android unterstützt.
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow mainWindow;
AnnotatedUrl annotatedUrl;
QObject::connect(&annotatedUrl, &AnnotatedUrl::annotatedUrl,
&mainWindow, &MainWindow::displayAnnotatedUrl);
QObject::connect(&annotatedUrl, &AnnotatedUrl::nfcStateChanged,
&mainWindow, &MainWindow::nfcStateChanged);
QObject::connect(&annotatedUrl, &AnnotatedUrl::tagError,
&mainWindow, &MainWindow::showTagError);
annotatedUrl.startDetection();
mainWindow.show();
return a.exec();
}Nachrichtenfilterung
Wie oben erwähnt, unterstützt die Anwendung NDEF-Nachrichten eines bestimmten Formats. Eine korrekte Nachricht sollte die folgenden Felder enthalten:
- Mindestens einen NDEF-Text-Datensatz, der als Header verwendet wird.
- Genau einen NDEF-URI-Datensatz.
- Einen optionalen MIME-Datensatz mit einem Symbol.
Die Reihenfolge der Datensätze ist nicht streng vorgegeben.
Zur Validierung der NDEF-Nachricht wird eine Instanz von „ QNdefFilter “ verwendet. Der Filter wird wie folgt bestückt:
messageFilter.setOrderMatch(false);
messageFilter.appendRecord<QNdefNfcTextRecord>(1, 100);
messageFilter.appendRecord<QNdefNfcUriRecord>(1, 1);
messageFilter.appendRecord(QNdefRecord::Mime, "", 0, 1);Wenn die eingehende Nachricht nicht mit dem Filter übereinstimmt, wird eine Fehlermeldung angezeigt:

Hinweis: Mitder Beispielanwendung „NDEF Editor“ können Tags mit korrekter oder fehlerhafter Nachrichtenstruktur erstellt werden.
Implementierung des „AnnotatedUrl“-Handlers
Die vom „ QNearFieldManager “ gelesenen NFC-Nachrichten werden an „ AnnotatedUrl::handleMessage “ weitergeleitet.
void AnnotatedUrl::handleMessage(const QNdefMessage &message, QNearFieldTarget *target)
{Zunächst werden die Nachrichten mithilfe der Methode „ QNdefFilter::match()“ validiert:
if (!messageFilter.match(message)) {
emit tagError("Invalid message format");
return;
}Wenn die Nachrichten das richtige Format haben, wird die Analyse fortgesetzt.
Da NFC-Nachrichten aus mehreren NDEF-Datensätzen bestehen, ermöglicht das Durchlaufen aller Datensätze die Extraktion der drei Parameter, die in der Benutzeroberfläche angezeigt werden sollen: die URI, den Titel und das Pixmap:
for (const QNdefRecord &record : message) {
if (record.isRecordType<QNdefNfcTextRecord>()) {
QNdefNfcTextRecord textRecord(record);
title = textRecord.text();
QLocale locale(textRecord.locale());
} else if (record.isRecordType<QNdefNfcUriRecord>()) {
QNdefNfcUriRecord uriRecord(record);
url = uriRecord.uri();
} else if (record.typeNameFormat() == QNdefRecord::Mime &&
record.type().startsWith("image/")) {
pixmap = QPixmap::fromImage(QImage::fromData(record.payload()));
}Nachdem die Parameter der NFC-Nachricht extrahiert wurden, wird schließlich das entsprechende Signal ausgegeben, damit die Benutzeroberfläche damit arbeiten kann.
}
emit annotatedUrl(url, title, pixmap);
}Verarbeitung des Adapterzustands
Unter Android lassen sich Änderungen des Adapterzustands durch Anbindung an das Signal „ QNearFieldManager::adapterStateChanged()“ erkennen. Dadurch kann die Erkennung gestoppt werden, wenn der NFC-Adapter deaktiviert ist, und wieder gestartet werden, wenn der Adapter erneut aktiviert wird. Dieser Ansatz ist im Slot „ AnnotatedUrl::handleAdapterStateChange “ implementiert.
void AnnotatedUrl::handleAdapterStateChange(QNearFieldManager::AdapterState state)
{
if (state == QNearFieldManager::AdapterState::Online) {
startDetection();
} else if (state == QNearFieldManager::AdapterState::Offline) {
manager->stopTargetDetection();
emit nfcStateChanged(false);
}
}Automatischer Start der Anwendung
Android unterstützt den automatischen Start der Anwendung beim Berühren des NDEF-Tags. Informationen zu den erforderlichen Änderungen an der Android-Manifest-Datei finden Sie unter „Qt NFC “ auf Android.
Die Einführung einer benutzerdefinierten „AndroidManifest.xml“-Datei erfordert spezielle Schritte auf Seiten des Build-Systems.
Erstellen mit qmake
Bei Verwendung von qmake muss Folgendes zur Datei „ .pro “ hinzugefügt werden:
android {
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
DISTFILES += \
android/AndroidManifest.xml
}Erstellen mit CMake
Bei Verwendung von CMake muss Folgendes zur Datei „ CMakeLists.txt “ hinzugefügt werden:
if(ANDROID)
set_property(TARGET annotatedurl
APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/android
)
endif()Ausführen des Beispiels
Sie können das Beispiel wie folgt ausführen:
- Qt Creator
Öffnen Sie den „ Welcome “-Modus und wählen Sie das Beispiel unter „ Examples “ aus. Weitere Informationen finden Sie unter Qt Creator: Tutorial: Erstellen und Ausführen.
- Qt Extension for Visual Studio Code
Führen Sie den Befehl „ Qt: Open Qt examples “ über „ Command Palette “ aus und wählen Sie das Beispiel aus der Liste aus. Weitere Informationen finden Sie unter Qt Extension for Visual Studio Code: Tutorial: Erstellen und Ausführen.
Siehe auch Qt NFC.
© 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.