QNdefFilter 类

QNdefFilter 类提供用于匹配 NDEF 消息的过滤器。更多...

头文件 #include <QNdefFilter>
CMakefind_package(Qt6 REQUIRED COMPONENTS Nfc)
target_link_libraries(mytarget PRIVATE Qt6::Nfc)
qmakeQT += nfc

公共类型

结构Record

公共函数

QNdefFilter()
QNdefFilter(const QNdefFilter &other)
~QNdefFilter()
boolappendRecord(unsigned int min = 1, unsigned int max = 1)
boolappendRecord(QNdefRecord::TypeNameFormat typeNameFormat, const QByteArray &type, unsigned int min = 1, unsigned int max = 1)
boolappendRecord(const QNdefFilter::Record &record)
voidclear()
(since 6.2) boolmatch(const QNdefMessage &message) const
boolorderMatch() const
QNdefFilter::RecordrecordAt(qsizetype i) const
qsizetyperecordCount() const
voidsetOrderMatch(bool on)
QNdefFilter &operator=(const QNdefFilter &other)

详细描述

QNdefFilter 封装了 NDEF 消息的结构,用于匹配具有特定结构的消息。

以下过滤器匹配包含单个智能海报记录的 NDEF 消息

QNdefFilter filter;
filter.append(QNdefRecord::NfcRtd, "Sp");

以下过滤器匹配包含 URI、本地化文本和可选的 JPEG 图像的 NDEF 消息。记录的顺序必须按照指定的顺序

QNdefFilter filter;
filter.setOrderMatch(true);
filter.appendRecord(QNdefRecord::NfcRtd, "U");
filter.appendRecord<QNdefNfcTextRecord>();
filter.appendRecord(QNdefRecord::Mime, "image/jpeg", 0, 1);

可以使用 match() 方法检查消息是否匹配过滤器。

匹配算法

过滤器行为取决于 orderMatch() 参数的值。

注意:在下面的讨论中,如果 typeNameFormattype 参数匹配,我们将认为过滤器记录是相等的。联合两个记录意味着将它们的 minimummaximum 值分别相加。

无序匹配

如果不考虑记录顺序,过滤器中所有相等的记录都可以连接起来。生成的过滤器将仅包含唯一的记录,每个记录都具有更新后的 minimummaximum 值。

考虑以下示例

QNdefFilter filter;
filter.appendRecord<QNdefNfcTextRecord>(0, 1);
filter.appendRecord<QNdefNfcTextRecord>(0, 1);
filter.appendRecord(QNdefRecord::Mime, "", 1, 1);
filter.appendRecord<QNdefNfcTextRecord>(1, 1);
filter.setOrderMatch(false);

在不有序匹配中,过滤器将被简化为以下形式

QNdefFilter filter;
filter.appendRecord<QNdefNfcTextRecord>(1, 3);
filter.appendRecord(QNdefRecord::Mime, "", 1, 1);
filter.setOrderMatch(false);

一旦过滤器中只包含唯一记录,匹配算法将遍历消息并计算每种类型的实际记录数量。如果所有实际数量都符合对应的[最小值,最大值]范围,匹配算法返回true

有序匹配

如果记录顺序很重要,则需要采用不同的方法。在这种情况下,相等的记录不能简单地连接在一起。然而,连续的相等记录仍然可以连接。然后,匹配算法遍历消息,这次还将记录的位置考虑在内。

处理过滤器记录中的空类型

可以添加一个空type的过滤器记录。在这种情况下,空类型将作为任何类型的通配符。

例如,过滤器可以定义如下

QNdefFilter filter;
filter.addRecord(QNdefRecord::Mime, "", 1, 1);

此过滤器指定消息必须恰好包含一个通过Mime typeNameFormat()()和任何type()()定义的NDEF记录。

处理消息中的额外记录

如果消息包含一些不与过滤器中任何记录匹配的记录,匹配算法将返回false

过滤器示例

下表中,每个过滤器记录都以下列参数(按给定顺序)指定

  • typeNameFormat - 包含记录的typeNameFormat()。
  • type - 包含记录的type()。
  • minimum - 包含消息中记录的最小出现次数。
  • maximum - 包含消息中记录的最大出现次数。

过滤器包含多条记录。

消息由多个QNdefRecord组成。在下表中,只显示每条记录的typeNameFormat()和type(),因为其他参数对过滤不重要。

过滤器消息匹配结果注释
空过滤器空消息匹配
空过滤器非空消息不匹配
非空过滤器空消息不匹配
[(QNdefRecord::NfcRtd, "T", 1, 2), (QNdefRecord::Mime, "", 1, 1), (QNdefRecord::Empty, "", 0, 100)][(QNdefRecord::Mime, "image/jpeg"), (QNdefRecord::Empty, ""), (QNdefRecord::NfcRtd, "T"), (QNdefRecord::Empty, ""), (QNdefRecord::NfcRtd, "T")]无序:匹配有序过滤器不匹配,因为消息必须以QNdefRecord::NfcRtd记录开头,但它以QNdefRecord::Mime记录开头。
有序:不匹配
[(QNdefRecord::NfcRtd, "T", 0, 2), (QNdefRecord::Mime, "", 1, 1), (QNdefRecord::NfcRtd, "T", 1, 1)][(QNdefRecord::NfcRtd, "T"), (QNdefRecord::NfcRtd, "T"), (QNdefRecord::Mime, "image/jpeg")]无序:匹配排序后的过滤器不匹配,因为没有在QNdefRecord::Mime记录之后期望一个QNdefRecord::NfcRtd记录,但信息中并没有它。
有序:不匹配
[(QNdefRecord::NfcRtd, "T", 0, 2), (QNdefRecord::NfcRtd, "T", 1, 1), (QNdefRecord::Mime, "", 1, 1)][(QNdefRecord::NfcRtd, "T"), (QNdefRecord::Mime, "image/jpeg")]无序:匹配两种情况都匹配,因为信息包含所需的最小记录数并且顺序正确。
排序:匹配

成员函数文档

QNdefFilter::QNdefFilter()

构造一个新的NDEF过滤器。

QNdefFilter::QNdefFilter(const QNdefFilter &other)

构造一个新NDEF过滤器,它是other的副本。

[noexcept] QNdefFilter::~QNdefFilter()

销毁NDEF过滤器。

模板 <typename T> bool QNdefFilter::appendRecord(unsigned int min = 1, unsigned int max = 1)

将匹配模板参数的记录追加到NDEF过滤器中。该记录必须在NDEF消息中发生minmax次。

如果记录成功追加,则返回true。否则返回false

bool QNdefFilter::appendRecord(QNdefRecord::TypeNameFormat typeNameFormat, const QByteArray &type, unsigned int min = 1, unsigned int max = 1)

将具有类型名格式typeNameFormat和类型type的记录追加到NDEF过滤器中。该记录必须在NDEF消息中发生minmax次。

如果记录成功追加,则返回true。否则返回false

bool QNdefFilter::appendRecord(const QNdefFilter::Record &record)

验证record并将其追加到NDEF过滤器中。

如果记录成功追加,则返回true。否则返回false

void QNdefFilter::clear()

清除过滤器。

[since 6.2] bool QNdefFilter::match(const QNdefMessage &message) const

如果message与给定的过滤器匹配,则返回true。否则返回false

有关匹配的更详细解释,请参阅匹配算法

此函数自Qt 6.2起引入。

bool QNdefFilter::orderMatch() const

如果过滤器在匹配时考虑NDEF记录顺序,则返回true。否则返回false

另请参阅setOrderMatch()。

QNdefFilter::Record QNdefFilter::recordAt(qsizetype i) const

返回索引 i 的 NDEF 记录。

i 必须是一个有效的索引(即 0 <= i < recordCount()).

另请参阅:recordCount().

qsizetype QNdefFilter::recordCount() const

返回过滤器中 NDEF 记录的数量。

void QNdefFilter::setOrderMatch(bool on)

设置过滤器的排序要求。如果 ontrue,则仅当过滤器中记录的顺序与 NDEF 消息中记录的顺序相匹配时,过滤才有效。如果 onfalse,则在匹配时不会考虑记录的顺序。

默认情况下,不考虑记录顺序。

另请参阅:orderMatch().

QNdefFilter &QNdefFilter::operator=(const QNdefFilter &other)

other 赋值给此过滤器并返回对此过滤器的引用。

© 2024 The Qt Company Ltd. 本文档中的贡献文档归其各自所有者所有。本提供的文档受 Free Software Foundation 发布的 GNU 自由文档许可证版本 1.3 的条款约束。Qt 和相应的徽标是 The Qt Company Ltd. 在芬兰和/或世界其他国家的商标。所有其他商标均为其各自所有者的财产。