如何使QML文本字段绑定在Android下工作?

如何使QML文本字段绑定在Android下工作?,android,c++,qt,qml,textfield,Android,C++,Qt,Qml,Textfield,我目前正在尝试为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 {

我目前正在尝试为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;
};
ColumnLayout {
  TextField {
    id: myField
    placeholderText: qsTr("Enter text")
    Layout.fillWidth: true
    Binding {
      target: myClass
      property: "prop"
      value: myField.displayText
    }
}
因此,在我的QML资料中,有一个项是用以下方式定义的:

ColumnLayout {
  TextField {
    id: myField
    placeholderText: qsTr("Enter text")
    Layout.fillWidth: true
    Binding {
      target: myClass
      property: "prop"
      value: myField.text
    }
}
当然,我做了所有必要的事情来让对象MyClass类的对象在C++和QML之间共享(作为上下文属性)。p> 现在,问题是:无论我在上面的文本字段中键入什么,在Android下,最后一个单词永远不会从myField.text传递到MyClass.m_Prop。例如,如果我在TextField中键入文本“我不喜欢这个TextField”,那么myClass.m_Prop将包含“我不喜欢这个”。但是,如果我键入“我对这个文本字段不满意”(注意空格),然后删除最后一个空格,那么所需的字符串将存储在m_Prop变量中

奇怪的是,这在Linux下工作得非常好。有人能告诉我这里缺少什么吗?我正在使用Qt5.7和Android 6.0


谢谢你的帮助……

据我所知,对我的问题的评论,我有一些可能解决这个问题。最简单的方法是修改我的QML项,如下所示:

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;
};
ColumnLayout {
  TextField {
    id: myField
    placeholderText: qsTr("Enter text")
    Layout.fillWidth: true
    Binding {
      target: myClass
      property: "prop"
      value: myField.displayText
    }
}
如果我不想允许预测性文本输入,那么我可以添加

inputMethodHints: Qt.ImhNoPredictiveText
在文本字段上。在我的例子中,我需要预测性文本输入

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


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

请注意,在android emulator上,这也可以正常工作。原因是文本尚未在android上提交,请参阅以了解更多信息,尤其是。尝试使用
displayText
而不是
text
。前者包括来自输入法的部分文本输入。或者,如果您不需要预测性文本输入,请在
TextField
上设置
inputMethodHints:Qt.ImhNoPredictiveText
。谢谢,现在可以使用displayText。我理解您的其他输入,这些输入对我理解此特定功能非常有价值!