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