在QML对象之间传递事件

时间:2014-11-13 16:58:17

标签: qt qml qevent

我有一种情况,我想将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
  • 的中间

3 个答案:

答案 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属性:

  

此属性提供了一种将转发按键,键释放和键盘输入从输入方法输入到其他项目的方法。当您希望一个项目处理某些键(例如向上和向下箭头键)和另一个处理其他键的项目(例如左右箭头键)时,这可能很有用。一旦转发了密钥的项目接受了该事件,它就不再转发到列表中的项目。

文档提供了一个很好的简单示例。