简体   繁体   English

如何使用C ++生成的键事件更改QML TextField文本属性

[英]How to change QML TextField text property using key events generated from C++

I have a QML LineEdit like: 我有一个像这样的QML LineEdit:

TextField
{
  id: testEdit
  text: "0"
  Keys.onPressed:
  {
    console.log("Press = " + event.key)
    console.log("Current text is " + text)
  }
  Keys.onReleased:
  {
    console.log("Release = " + event.key)
    console.log("Current text is " + text)
  }
}

I want to change its text property by simulating key events . 我想通过模拟按键事件来更改其text属性。 So I have C++ object (eventHandler) exposed to QML generating key events: 因此,我让暴露给QML的C ++对象(eventHandler)生成了关键事件:

void normalKeyPress(QQuickItem *receiver, QString keys)
{
  receiver->forceActiveFocus();

  QKeySequence keysSeq = QKeySequence(keys);
  for (auto idx = 0; idx < keysSeq.count(); ++idx)
  {
    auto keyCode = keysSeq[idx];
    auto keyEvent = new QKeyEvent(QEvent::KeyPress, keyCode, Qt::NoModifier);
    auto keyEventSent = QApplication::sendEvent(receiver, keyEvent);

    keyEvent = new QKeyEvent(QEvent::KeyRelease, keyCode, Qt::NoModifier);
    keyEventSent = QApplication::sendEvent(receiver, keyEvent);
  }
}

Now in QML, when I do: 现在在QML中,当我这样做时:

testEdit.forceActiveFocus()
eventHandler.normalKeyPress(testEdit, "4")
eventHandler.normalKeyPress(testEdit, "Enter")

I get the following output: 我得到以下输出:

qml: Press = 52
qml: Current text is 0
qml: Release = 52
qml: Current text is 0
qml: Press = 16777221
qml: Current text is 0
qml: Release = 16777221
qml: Current text is 0

So key events are correctly received by the QML LineEdit. 因此,QML LineEdit可以正确接收关键事件。

But why text property is not updated accordingly? 但是为什么text属性没有相应更新?

UPDATE #1: if I use a TextInput instead of a TextField , then it works as expected. 更新#1:如果我使用TextInput而不是TextField ,那么它将按预期工作。

Well, looking at your code, I think the solution in adding setProperty() method to your reciever . 好吧,看看您的代码,我认为将setProperty()方法添加到reciever的解决方案。 So your code will be: 因此,您的代码将是:

void normalKeyPress(QQuickItem *receiver, QString keys)
{
  receiver->forceActiveFocus();
  receiver->setProperty("text", keys);

  <...>
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM