4

我想通过模拟 的发射来测试我的 Qt 小部件的“复制”功能QKeySequence::Copy,但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)用来查找主绑定,但我看不到如何提取键和修饰符。或者,是否有其他方法可以获得相同的结果?

4

3 回答 3

3

解决了:operator[]返回 aQt::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));
}
于 2013-01-14T09:09:03.553 回答
1

您可以使用该QKeySequence::keyBindings()方法获取给定的所有可用键序列,SequenceKey然后使用此问题中的答案提取键。

或者,您可以QKeySequence使用该toString函数将每个字符串转换为字符串,将字符串拆分为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;
}
于 2013-01-12T11:25:15.000 回答
0

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

如果使用 Qt 5.10 或更高版本,您可以调用:

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

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

于 2021-06-21T12:08:26.023 回答