首页 > 解决方案 > `QKeySequence::match()` 什么时候返回 `QKeySequence::PartialMatch`?

问题描述

哪些序列部分匹配?

我认为1部分匹配Ctrl+1,但事实并非如此。

标签: qt

解决方案


取自源代码

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;
}

看起来,

  1. 比较的序列必须比源长
  2. 比较的序列必须从源开始

所以,如果你有,

#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。


推荐阅读