如何使QML TextField绑定在Android下工作?

Lau*_*hel 2 c++ qt android textfield qml

我目前正在尝试为Android编写QML / C ++应用程序。在代码的某个地方,我有一个看起来像这样的类:

class MyClass : public QObject
{
  Q_OBJECT

  Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged)

public:
  explicit MyClass(QObject* a_Parent = 0);

  QString prop() const
  {
    return m_Prop;
  }

  void setProp(const QString& a_Value)
  {
    m_Prop = a_Value;
    emit propChanged();
  }

signals:
  void propChanged();

private:
  QString m_Prop;
};
Run Code Online (Sandbox Code Playgroud)

在我的QML资料中的某处,我有一个通过以下方式定义的Item:

ColumnLayout {
  TextField {
    id: myField
    placeholderText: qsTr("Enter text")
    Layout.fillWidth: true
    Binding {
      target: myClass
      property: "prop"
      value: myField.text
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,我做了一切必要的工作,以使MyClass类型的对象myClass在C ++和QML之间共享(作为上下文属性)。

现在,问题就出在下面:无论我在Android上的上述文本字段中键入什么,都不会将最后一个单词从myField.text传递到MyClass.m_Prop。例如,如果我在TextField中键入文本“我对此文本字段不满意”,则myClass.m_Prop将包含“我对此文本不满意”。但是,如果键入“我对这个TextField不满意”(注意空格),然后删除最后一个空格,则所需的字符串将存储在m_Prop变量中。

奇怪的是,这在Linux下工作得很好。有人可以告诉我我在这里想念的吗?我正在使用Qt 5.7和Android 6.0。

谢谢你的帮助 ...

Lau*_*hel 5

据我对问题的评论理解,我有几种解决这个问题的可能性。最简单的方法是像这样修改我的QML项:

ColumnLayout {
  TextField {
    id: myField
    placeholderText: qsTr("Enter text")
    Layout.fillWidth: true
    Binding {
      target: myClass
      property: "prop"
      value: myField.displayText
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我不想允许预想输入法,那么我可以添加

inputMethodHints: Qt.ImhNoPredictiveText
Run Code Online (Sandbox Code Playgroud)

在TextField上。就我而言,我希望输入预测性文字。

最后,当我单击应用程序的“完成”按钮时,可以调用QInputMethod :: commit(),它将在Android上提交显示的文本,然后在MyClass中使用提交的文本。在这种情况下,我不应该使用QML的Binding功能。相反,我应该将数据提交到Android,然后将我的QML数据传递给myClass。

最适合QML原理的最简单解决方案可能是使用displayText而不是text,这是我选择的解决方案。