qt - `QKeySequence::match()` 什么时候返回 `QKeySequence::PartialMatch`?
问题描述
哪些序列部分匹配?
我认为1
部分匹配Ctrl+1
,但事实并非如此。
解决方案
取自源代码,
QKeySequence::SequenceMatch QKeySequence::matches(const QKeySequence &seq) const {
uint userN = count(),
seqN = seq.count();
if (userN > seqN)
return NoMatch;
// If equal in length, we have a potential ExactMatch sequence,
// else we already know it can only be partial.
SequenceMatch match = (userN == seqN ? ExactMatch : PartialMatch);
for (uint i = 0; i < userN; ++i) {
QKeyCombination userKey = (*this)[i],
sequenceKey = seq[i];
if (userKey != sequenceKey)
return NoMatch;
}
return match;
}
看起来,
- 比较的序列必须比源长
- 比较的序列必须从源开始
所以,如果你有,
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QKeySequence>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QKeySequence ks_1{Qt::CTRL, Qt::Key_X, Qt::Key_Y};
QKeySequence ks_2{Qt::CTRL};
QKeySequence ks_3{Qt::CTRL, Qt::Key_X};
QKeySequence ks_4{Qt::CTRL, Qt::Key_X, Qt::Key_Y};
QKeySequence ks_5{Qt::CTRL, Qt::Key_X, Qt::Key_Y, Qt::Key_Z};
qDebug() << ks_1.count() << ks_2.count() << ks_1.matches(ks_2);
qDebug() << ks_1.count() << ks_3.count() << ks_1.matches(ks_3);
qDebug() << ks_1.count() << ks_4.count() << ks_1.matches(ks_4);
qDebug() << ks_1.count() << ks_5.count() << ks_1.matches(ks_5);
return a.exec();
}
ks_4
将是完全匹配,并且ks_5
将是部分匹配。请注意,长度是使用 获取count()
的,来源是:
int QKeySequence::count() const
{
return int(std::distance(d->key, std::find(d->key, d->key + QKeySequencePrivate::MaxKeyCount, 0)));
}
因此,如果前面的示例声明为:
QKeySequence ks_1{Qt::CTRL + Qt::Key_X + Qt::Key_Y};
QKeySequence ks_2{Qt::CTRL};
QKeySequence ks_3{Qt::CTRL + Qt::Key_X};
QKeySequence ks_4{Qt::CTRL + Qt::Key_X + Qt::Key_Y};
QKeySequence ks_5{Qt::CTRL + Qt::Key_X + Qt::Key_Y + Qt::Key_Z};
全部都不匹配,因为count()
以上所有情况都返回 1。
推荐阅读
- c# - 将 json 对象反序列化为 C# 对象
- arrays - 对象一走就继续移动
- excel - 在网络或 onedrive 文件夹上运行代码时遇到问题
- firebase - Firebase Analytics 控制台“最新版本”显示“没有要显示的数据”
- jasper-reports - JasperReport:在一份报告中显示多个列表
- c++11 - 如何比较两个非常大的数字
- regex - Bash 脚本失败 - 正则表达式
- java - 创建一个允许用户选择玩家数量的java彩票程序
- node.js - Postgres,插入到节点应用程序中的数组类型中
- python - Pandas 中列的值作为列,同时保持上次更新