QNdefFilter Class
QNdefFilter 类提供了一个用于匹配 NDEF 消息的过滤器。更多内容...
| 头文件: | #include <QNdefFilter> |
| CMake: | 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);一旦过滤器中仅包含唯一记录,匹配算法将遍历消息并计算每种类型的实际记录数量。如果所有实际数量都符合相应的 [minimum, maximum] 范围,则匹配算法返回true 。
有序匹配
如果记录顺序很重要,则采用不同的方法。在这种情况下,无法简单地将相等的记录合并在一起。但是,连续的相等记录仍然可以合并。然后,匹配算法遍历消息,这次还会考虑记录的位置。
处理过滤记录中的空类型
可以添加一个type 为空的过滤记录。在这种情况下,空类型将作为任何类型的通配符。
例如,过滤器可定义如下:
QNdefFilter filter;
filter.addRecord(QNdefRecord::Mime, "", 1, 1);该过滤器指定消息必须恰好包含一个Mime 为typeNameFormat()的NDEF记录,以及任意type()的记录。
处理消息中的额外记录
如果消息中包含一些与过滤器中任何记录都不匹配的记录,则匹配算法将返回false 。
过滤器示例
在下表中,每个过滤器记录由以下参数(按给定顺序)指定:
typeNameFormat- 包含该记录的typeNameFormat()。type- 包含该记录的type()。minimum- 包含该记录在消息中出现的最小次数。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 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 分配给此过滤器,并返回对此过滤器的引用。
© 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.