QNdefFilter 类
QNdefFilter 类提供用于匹配 NDEF 消息的过滤器。更多...
头文件 | #include <QNdefFilter> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Nfc) target_link_libraries(mytarget PRIVATE Qt6::Nfc) |
qmake | QT += nfc |
公共类型
结构 | Record |
公共函数
QNdefFilter() | |
QNdefFilter(const QNdefFilter &other) | |
~QNdefFilter() | |
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) |
bool | appendRecord(const QNdefFilter::Record &record) |
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
- 包含记录的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消息中发生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
。
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)
设置过滤器的排序要求。如果 on 为 true
,则仅当过滤器中记录的顺序与 NDEF 消息中记录的顺序相匹配时,过滤才有效。如果 on 为 false
,则在匹配时不会考虑记录的顺序。
默认情况下,不考虑记录顺序。
另请参阅:orderMatch().
QNdefFilter &QNdefFilter::operator=(const QNdefFilter &other)
将 other 赋值给此过滤器并返回对此过滤器的引用。
© 2024 The Qt Company Ltd. 本文档中的贡献文档归其各自所有者所有。本提供的文档受 Free Software Foundation 发布的 GNU 自由文档许可证版本 1.3 的条款约束。Qt 和相应的徽标是 The Qt Company Ltd. 在芬兰和/或世界其他国家的商标。所有其他商标均为其各自所有者的财产。