URL annotée
Lit les messages au format NDEF (NFC Data Exchange Format).
L'exemple « URL annotée » utilise Qt NFC pour afficher le contenu de messages au format d’échange de données NFC (NDEF) spécifiquement formatés, lus à partir d’une balise NFC. Le message NDEF doit contenir un enregistrement URI, un enregistrement MIME « image/* » facultatif et un ou plusieurs enregistrements de texte localisés.
Voici l’état initial de l’exemple :

Si l’on touche une balise, son contenu NDEF s’affiche. Voici l’interface utilisateur pour une balise contenant un enregistrement de texte et un enregistrement URI :

Lorsque l’on appuie sur l’écran, l’URL s’ouvre dans le navigateur.
Définition de la classe `AnnotatedUrl`
La classe ` AnnotatedUrl ` encapsule la classe ` QNearFieldManager`, qui fournit la fonctionnalité de détection des balises NFC. Les messages NDEF sont lus par ` QNearFieldManager ` et transmis à un gestionnaire contenu dans la classe ` AnnotatedUrl `. Après analyse du message NDEF, la classe émet le signal ` annotatedUrl() `. L'interface utilisateur réagit à ce signal en affichant le contenu du message NDEF.
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;
};Remarque : la méthode startDetection() permet de différer la détection effective de la balise jusqu’à ce que toutes les connexions entre l’interface utilisateur et la logique liée au NFC soient établies. Ceci est important lorsque l’application est lancée automatiquement dès qu’une balise NFC est touchée. Ce cas d’utilisation est actuellement pris en charge sur Android.
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();
}Filtrage des messages
Comme mentionné ci-dessus, l’application prend en charge les messages NDEF d’un format spécifique. Un message correct doit contenir les champs suivants :
- Au moins un enregistrement de texte NDEF, qui servira d’en-tête.
- Exactement un enregistrement NDEF URI.
- Un enregistrement MIMEfacultatif avec une icône.
L'ordre des enregistrements n'est pas strictement défini.
Une instance de ` QNdefFilter ` est utilisée pour valider le message NDEF. Le filtre est renseigné comme suit :
messageFilter.setOrderMatch(false);
messageFilter.appendRecord<QNdefNfcTextRecord>(1, 100);
messageFilter.appendRecord<QNdefNfcUriRecord>(1, 1);
messageFilter.appendRecord(QNdefRecord::Mime, "", 0, 1);Si le message entrant ne correspond pas au filtre, un message d'erreur s'affiche :

Remarque : l'application exemple NDEF Editor peut être utilisée pour créer des balises avec une structure de message correcte ou incorrecte.
Implémentation du gestionnaire AnnotatedUrl
Les messages NFC lus par l'QNearFieldManager sont transmis à AnnotatedUrl::handleMessage.
void AnnotatedUrl::handleMessage(const QNdefMessage &message, QNearFieldTarget *target)
{Dans un premier temps, les messages sont validés à l’aide de la méthode QNdefFilter::match() :
if (!messageFilter.match(message)) {
emit tagError("Invalid message format");
return;
}Si les messages ont le format correct, l’analyse se poursuit.
Les messages NFC étant composés de plusieurs enregistrements NDEF, un parcours itératif de tous ces enregistrements permet d’extraire les 3 paramètres à afficher dans l’interface utilisateur : l’URI, le titre et le 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()));
}Enfin, une fois les paramètres du message NFC extraits, le signal correspondant est émis afin que l’interface utilisateur puisse le traiter.
}
emit annotatedUrl(url, title, pixmap);
}Gestion de l’état de l’adaptateur
Sous Android, les changements d’état de l’adaptateur peuvent être détectés en se connectant au signal ` QNearFieldManager::adapterStateChanged()`. Cela permet d’arrêter la détection lorsque l’adaptateur NFC est désactivé, et de la relancer lorsque l’adaptateur est réactivé. Cette approche est implémentée dans le slot ` AnnotatedUrl::handleAdapterStateChange `.
void AnnotatedUrl::handleAdapterStateChange(QNearFieldManager::AdapterState state)
{
if (state == QNearFieldManager::AdapterState::Online) {
startDetection();
} else if (state == QNearFieldManager::AdapterState::Offline) {
manager->stopTargetDetection();
emit nfcStateChanged(false);
}
}Lancement automatique de l’application
Android prend en charge le démarrage automatique de l’application lorsque la balise NDEF est touchée. Consultez la section « Qt NFC » sur Android pour connaître les modifications requises à apporter au fichier manifeste Android.
L’introduction d’un fichier AndroidManifest.xml personnalisé nécessite des étapes spécifiques au niveau du système de compilation.
Compilation avec qmake
Lorsque vous utilisez qmake, les éléments suivants doivent être ajoutés au fichier .pro:
android {
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
DISTFILES += \
android/AndroidManifest.xml
}Compilation avec CMake
Lorsque vous utilisez CMake, les éléments suivants doivent être ajoutés au fichier CMakeLists.txt:
if(ANDROID)
set_property(TARGET annotatedurl
APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/android
)
endif()Exécution de l'exemple
Vous pouvez exécuter l'exemple à partir de :
- Qt Creator
Ouvrez le mode « Welcome » et sélectionnez l'exemple dans « Examples ». Pour plus d'informations, consultez Qt Creator: Tutoriel : Compiler et exécuter.
- Qt Extension for Visual Studio Code
Exécutez la commande « Qt: Open Qt examples » à partir de Command Palette, puis sélectionnez l’exemple dans la liste. Pour plus d’informations, consultez Qt Extension for Visual Studio Code: Tutoriel : Compiler et exécuter.
Voir aussi 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.