如何模拟标准键序列的发射?

时间:2013-01-11 17:44:37

标签: qt testing keyboard-shortcuts

我想通过模拟QKeySequence::Copy的发布来测试我的Qt小部件的“复制”功能,但QTest::keyClick不接受QKeySequence(或QKeySequence::StandardKey):

void QTest::keyClick ( QWidget * widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1 ) [static]
void QTest::keyClick ( QWidget * widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1 ) [static]

我可以将副本硬编码为 Ctrl + C

QTest::keyClick(widget, Qt::Key_C, Qt::ControlModifier)

然而,在其他环境中测试我的小部件时,这会相当脆弱并且可能会失败,所以如果可能的话,我更愿意使用QKeySequence::Copy

我知道我可以使用QKeySequence::QKeySequence(StandardKey)来查找主要绑定,但我看不到如何提取键和修饰符。或者,是否有其他方法可以获得相同的结果?

3 个答案:

答案 0 :(得分:2)

完成了工作:operator[]返回Qt::KeyQt::KeyboardModifiers标志类型的按位组合(这似乎没有在任何地方记录)。因此,提取键和修饰符的方法是使用Qt::KeyboardModifierMask(也完全没有文档)进行掩码:

QKeySequence binding(QKeySequence::Copy);
for (uint i = 0; i < binding.count(); ++i) {
    uint key = binding[i];
    QTest::keyClick(widget, Qt::Key(key & ~Qt::KeyboardModifierMask),
        Qt::KeyboardModifiers(key & Qt::KeyboardModifierMask));
}

答案 1 :(得分:1)

您可以使用QKeySequence::keyBindings()方法获取给定SequenceKey的所有可用密钥序列,然后使用this question中的答案提取密钥。

或者,您可以使用toString函数将每个QKeySequence转换为字符串,使用QStringList作为分隔符将字符串拆分为+,然后转换每个部分使用帮助函数列出相应的Qt::Key

QList<QKeySequence> bindings = QKeySequence::keyBindings(QKeySequence::Copy);
for (int i=0; i<bindings.count(); i++)
{
    QStringList keysList = bindings[i].toString().split("+");
    QVector<int> keys = getKeys(keysList);
}


QVector<int> getKeys(const QStringList& list)
{
    QVector<int> keys;
    for (int i=0; i<list.count(); i++)
    {
        if (list[i] == "Ctrl")
            keys << Qt::Key_Control;
        else if (list[i] == "F11")
            keys << Qt::Key_F11;
        else if (list[i] == "Ins")
            keys << Qt::Key_Insert;
        // add remaining modifiers
        // single letters
        else
            keys << list[i][0].toAscii();
    }
    return keys;
}

答案 2 :(得分:0)

我遇到了同样的问题并且接受的答案有效,但是我发现了另一种简单的方法来做到这一点(只是想在此处添加它,以防其他人正在寻找解决方案)。

如果使用 Qt 5.10 或更高版本,您只需调用:

QTest::keySequence(widget, QKeySequence::Copy);

https://doc.qt.io/qt-5/qtest.html#keySequence-1