QNdefFilter Class
QNdefFilter 类为匹配 NDEF 消息提供了一个过滤器。更多
Header: | #include <QNdefFilter> |
CMake.QNdefFilter | find_package(Qt6 REQUIRED COMPONENTS Nfc) target_link_libraries(mytarget PRIVATE Qt6::Nfc) |
qmake: | QT += nfc |
公共类型
struct | Record |
公共函数
QNdefFilter() | |
QNdefFilter(const QNdefFilter &other) | |
~QNdefFilter() | |
bool | appendRecord(const QNdefFilter::Record &record) |
bool | appendRecord(unsigned int min = 1, unsigned int max = 1) |
bool | appendRecord(QNdefRecord::TypeNameFormat typeNameFormat, const QByteArray &type, unsigned int min = 1, unsigned int max = 1) |
void | clear() |
(since 6.2) bool | match(const QNdefMessage &message) const |
bool | orderMatch() const |
QNdefFilter::Record | recordAt(qsizetype i) const |
qsizetype | recordCount() const |
void | setOrderMatch(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() 参数的值。
注: 在下面的讨论中,如果typeNameFormat
和type
参数匹配,我们将认为过滤记录相等。连接两条记录意味着分别加上它们的minimum
和maximum
值。
无序匹配
如果不考虑记录顺序,则可以连接筛选器中所有相等的记录。结果过滤器将只包含唯一记录,每条记录都有更新后的minimum
和maximum
值。
请看下面的示例:
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
- 包含记录的 () 。typeNameFormattype
- 包含记录的 () 。typeminimum
- 包含该记录在邮件中出现的最少次数。maximum
- 包含记录在邮件中出现的最大次数。
过滤器包含多条记录。
邮件由多个QNdefRecords 组成。在下表中,只显示每条记录的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 过滤器。
bool QNdefFilter::appendRecord(const QNdefFilter::Record &record)
验证record 并将其附加到 NDEF 过滤器。
如果记录已成功附加,则返回true
。否则返回false
。
template <typename T> bool QNdefFilter::appendRecord(unsigned int min = 1, unsigned int max = 1)
将符合模板参数的记录附加到 NDEF 过滤器。该记录必须出现在 NDEF 报文的min 和max 之间。
如果记录追加成功,则返回true
。否则返回false
。
bool QNdefFilter::appendRecord(QNdefRecord::TypeNameFormat typeNameFormat, const QByteArray &type, unsigned int min = 1, unsigned int max = 1)
将类型名称格式为typeNameFormat 、类型为type 的记录附加到 NDEF 过滤器。该记录必须出现在 NDEF 报文的min 和max 之间。
如果记录添加成功,则返回true
。否则返回false
。
void QNdefFilter::clear()
清除过滤器。
[since 6.2]
bool QNdefFilter::match(const QNdefMessage &message) const
如果message 与给定过滤器匹配,则返回true
。否则返回false
。
有关匹配的详细解释,请参见Matching Algorithms 。
此函数在 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)
设置过滤器的排序要求。如果on 为true
,则只有当过滤器中记录的顺序与 NDEF 报文中记录的顺序一致时,过滤器才会匹配。如果on 为false
,则匹配时不考虑记录顺序。
默认情况下不考虑记录顺序。
另请参阅 orderMatch() 。
QNdefFilter &QNdefFilter::operator=(const QNdefFilter &other)
将other 分配给此过滤器,并返回此过滤器的引用。
© 2025 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.