我有一种情况,我想将QML事件传递给初始事件处理程序中间的另一个QML项。 e.g。
Item {
id: item1
Keys.onPressed: {
// Pre-process...
passEventToObject(event, item2);
// Post-process based on results of event passing...
}
}
TextInput {
id: item2
// Expect key press event to be handled by text input
}
我可以做些什么来实现passEventToObject
?
备注:
Keys.onPressed
内的item2
,它是内置的QML(TextInput
)。item1.Keys.onPressed
答案 0 :(得分:2)
在Items之间移动事件的一种方法是创建C ++插件并使用QCoreApplication::sendEvent
。不幸的是,Qt没有直接映射到QML KeyEvent
和C ++ QKeyEvent
,因此插件的接口需要公开事件的内部:
bool EventRelay::relayKeyPressEvent(
int key,
Qt::KeyboardModifiers modifiers,
const QString& text,
bool autoRepeat,
ushort count) const
{
QKeyEvent event(QKeyEvent::KeyPress, key, modifiers, text, autoRepeat, count);
return relayEventToObject(&event, mpTargetObject);
}
使用它:
EventRelay { id: relay }
Item {
id: item1
Keys.onPressed: {
// Pre-process...
relay.relayEventToObject(event, item2);
// Post-process...
}
}
TextInput {
id: item2
}
答案 1 :(得分:2)
您可以在第一个对象信号处理程序中调用另一个对象的信号:
Item {
id: item1
Keys.onPressed: {
// Pre-process...
item2.Keys.pressed(event);
// Post-process based on results of event passing...
}
}
Item {
id: item2
Keys.onPressed: {
// Some other stuff happens here
}
}
答案 2 :(得分:1)
我认为“信号到信号连接”部分可以找到here。
基本上,每个信号都有connect
方法,可用于创建信号链。
如果您对forword关键事件感兴趣(如您的示例所示),请考虑使用forwardTo
属性:
此属性提供了一种将转发按键,键释放和键盘输入从输入方法输入到其他项目的方法。当您希望一个项目处理某些键(例如向上和向下箭头键)和另一个处理其他键的项目(例如左右箭头键)时,这可能很有用。一旦转发了密钥的项目接受了该事件,它就不再转发到列表中的项目。
文档提供了一个很好的简单示例。