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

Qt 如何模拟标准键序列的发射?,qt,testing,keyboard-shortcuts,Qt,Testing,Keyboard Shortcuts,我想通过模拟发射QKeySequence::copy来测试我的Qt小部件的“复制”功能,但不接受QKeySequence(或QKeySequence::StandardKey): 我可以硬编码复制为Ctrl+C: 然而,这将非常脆弱,在其他环境中测试我的小部件时可能会失败,所以如果可能的话,我更愿意使用QKeySequence::Copy 我知道我可以用它来查找主绑定,但我看不到如何提取键和修饰符。或者,是否有其他方法可以获得相同的结果?您可以使用该方法获取给定SequenceKey的所有可用密

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

我可以硬编码复制为Ctrl+C:

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

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

您可以使用该方法获取给定
SequenceKey
的所有可用密钥序列,然后使用中的答案提取密钥

或者,您可以使用函数将每个
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;
}
QList bindings=QKeySequence::keyBindings(QKeySequence::Copy);

对于(int i=0;i计算出来:
操作符[]
返回
Qt::Key
Qt::KeyboardModifiers
标志类型的按位组合(这似乎在任何地方都没有文档记录)。因此提取键和修饰符的方法是使用
Qt::KeyboardModifierMask
(也完全没有文档记录):

QKeySequence绑定(QKeySequence::Copy);
对于(uint i=0;i
通过
toString
转换似乎效率很低。看起来
运算符[]
是我想要的,但是返回的
uint
Qt::Key
有什么关系?
QTest::keyClick(widget, Qt::Key_C, Qt::ControlModifier)
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;
}
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));
}