Sur cette page

Qt NFC Présentation

Avec l'API « Qt NFC », les cas d'utilisation typiques sont les suivants :

  • Détection de balises NFC.
  • Lecture et écriture de messages NDEF.
  • Enregistrement de gestionnaires de messages NDEF.
  • Partage de fichiers et de messages.

Les sections suivantes décrivent comment utiliser les classes C++ et les types QML d'Qt NFC pour les cas d'utilisation ci-dessus.

Remarque : sous Android, la détection de nouvelles balises NFC ne fonctionne que dans les applications en premier plan. Les services Android ne prennent pas en charge cette fonctionnalité en raison de limitations de l’API côté Android. La seule façon d’utiliser une balise dans un service consiste à fournir une interface AIDL acceptant la balise et à la transmettre à Qt, comme le montre l’exemple suivant.

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

Présentation de C++

L’API C++ donne accès à l’ensemble complet des fonctionnalités de l’API Qt NFC. Cette section présente les principales fonctionnalités mises à la disposition des développeurs.

Détection des balises NFC

La classe ` QNearFieldManager ` est chargée de détecter les nouvelles balises NFC entrant dans le champ de détection de l’appareil. Les signaux ` QNearFieldManager::targetDetected()` et ` QNearFieldManager::targetLost()` sont émis lorsqu’une balise entre dans le champ de détection ou en sort. Le paramètre ` QNearFieldTarget ` transmis sert de point d’interaction principal pour chaque balise détectée. La détection ne démarre toutefois pas réellement tant que la fonction ` QNearFieldManager::startTargetDetection()` n’a pas été appelée.

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);

Enfin, la détection peut être arrêtée :

m_manager->stopTargetDetection();

Bien que chaque instance ` QNearFieldTarget ` appartienne à son instance ` QNearFieldManager ` associée, il peut être utile de supprimer manuellement chaque instance. Sinon, elles continueraient d’exister jusqu’à ce que l’instance ` QNearFieldManager ` soit supprimée. La meilleure façon de procéder est de le faire en réponse au signal ` QNearFieldManager::targetLost()` :

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

Remarque : l’objet cible ne doit être supprimé via `deleteLater()` que s’il est supprimé à l’intérieur du slot.

Connexion des balises NFC

Toutes les fonctions de QNearFieldTarget qui nécessitent une connexion en établissent une automatiquement. Une connexion active empêche d’autres instances d’établir une connexion, car une seule connexion à la fois est autorisée.

Dans Qt 5, la balise était déconnectée à la fin des fonctions afin de permettre à d’autres instances de se connecter. La méthode QNearFieldManager::setKeepConnection() permettait de modifier ce comportement.

Depuis Qt 6, QNearFieldTarget maintient la connexion par défaut. La connexion n’est fermée que lorsque l’ QNearFieldTarget est détruite ou que la fonction QNearFieldManager::disconnect() est appelée.

Lecture et écriture de messages NDEF

L’instance ` QNearFieldTarget ` renvoyée par le signal ` QNearFieldManager::targetDetected()` est utilisée pour interagir avec la balise. La lecture et l’écriture d’un message constituent une opération asynchrone. La classe ` QNearFieldTarget::RequestId ` associe les opérations individuelles à leurs résultats.

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;
    }
}

Une fois la requête QNearFieldTarget::readNdefMessages() traitée avec succès, le signal QNearFieldTarget::ndefMessageRead() est émis. Chaque QNdefMessage renvoyé peut comporter zéro ou plusieurs entrées QNdefRecord, identifiables par leur type. Pour plus d’informations sur le traitement des enregistrements, consultez la documentation de la classe ` QNdefRecord `. Comme le montre le code ci-dessus, l’écriture de messages NDEF est déclenchée via ` QNearFieldTarget::writeNdefMessages()`. La réussite de l’opération d’écriture est indiquée par l’émission du signal ` QNearFieldTarget::requestCompleted()` avec l’identifiant de requête correspondant. Tout type d’erreur lors de la lecture ou de l’écriture est signalé via ` QNearFieldTarget::error()`.

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