このページでは

Qt NFC 概要

Qt NFC APIの代表的なユースケースは以下の通りです:

  • NFCタグの検出。
  • NDEFメッセージの読み取りおよび書き込み。
  • NDEFメッセージハンドラの登録。
  • ファイルやメッセージの共有。

以下のセクションでは、上記のユースケースにおいて、Qt NFC のC++クラスおよびQML型を使用する方法について説明します。

注: Androidでは 、新しい NFC タグの検出はフォアグラウンドのアプリケーションでのみ機能します。Android 側の API の制限により、Android サービスではこれをサポートしていません。サービス内でタグを使用する唯一の方法は、次の例に示すように、タグを受け入れるAIDLインターフェースを用意し、それを Qt に転送することです。

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

C++の概要

C++ API では、Qt NFC API の全機能セットにアクセスできます。このセクションでは、開発者が利用できる主な機能について紹介します。

NFCタグの検出

QNearFieldManager クラスは、デバイスの検知範囲内に新たなNFCタグが入ってきた際の検出を担当します。タグが検知範囲内に入ったとき、または範囲外に出たときに、QNearFieldManager::targetDetected()およびQNearFieldManager::targetLost()シグナルが発信されます。渡されるQNearFieldTarget パラメータは、検出された各タグに対する主要なインタラクションポイントとして機能します。ただし、QNearFieldManager::startTargetDetection()が呼び出されるまで、実際の検出は開始されません。

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

最後に、検出を停止することができます:

m_manager->stopTargetDetection();

各QNearFieldTarget インスタンスは、関連するQNearFieldManager インスタンスによって管理されていますが、各インスタンスを手動で削除しておくと有益な場合があります。そうしないと、QNearFieldManager インスタンスが削除されるまで、それらのインスタンスは存在し続けてしまいます。これを行う最善の方法は、QNearFieldManager::targetLost()シグナルに応答して行うことです:

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

注: ターゲットオブジェクトは 、スロット内で削除される場合にのみ、deleteLater() を通じて削除する必要があります。

NFCタグの接続

QNearFieldTarget の接続を必要とするすべての関数は、自動的に接続を確立します。アクティブな接続が存在すると、一度に1つの接続しか許可されないため、他のインスタンスが接続を確立できなくなります。

Qt 5 では、他のインスタンスが接続できるように、関数の終了時にタグの接続が切断されていました。QNearFieldManager::setKeepConnection() を使用することで、この挙動を変更することができました。

Qt 6以降、QNearFieldTarget はデフォルトで接続を維持します。接続が閉じられるのは、QNearFieldTarget が破棄された場合、またはQNearFieldManager::disconnect()が呼び出された場合のみです。

NDEFメッセージの読み取りと書き込み

QNearFieldManager::targetDetected() シグナルによって返されるQNearFieldTarget インスタンスは、タグとのやり取りに使用されます。メッセージの読み取りおよび書き込みは非同期操作です。QNearFieldTarget::RequestId クラスは、個々の操作とその結果を関連付けます。

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

QNearFieldTarget::readNdefMessages()リクエストが正常に処理されると、QNearFieldTarget::ndefMessageRead()シグナルが発信されます。返される各QNdefMessage は、0個以上のQNdefRecord エントリで構成されることがあり、これらはそのタイプによって識別できます。 レコードの処理に関する詳細については、QNdefRecord クラスのドキュメントを参照してください。上記のコードが示すように、NDEFメッセージの書き込みはQNearFieldTarget::writeNdefMessages()によってトリガーされます。書き込み操作が正常に完了すると、対応するリクエストIDを伴うQNearFieldTarget::requestCompleted()シグナルが発行されます。読み取りまたは書き込み中のあらゆる種類のエラーは、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.