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

Posted

技术标签:

【中文标题】如何使 QML TextField 绑定在 Android 下工作?【英文标题】:How to make QML TextField binding work under Android? 【发布时间】:2017-05-20 16:17:25 【问题描述】:

我目前正在尝试为 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;
;

在我的 QML 内容中,我有一个按以下方式定义的项目:

ColumnLayout 
  TextField 
    id: myField
    placeholderText: qsTr("Enter text")
    Layout.fillWidth: true
    Binding 
      target: myClass
      property: "prop"
      value: myField.text
    

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

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

奇怪的是,这在 Linux 下运行得非常好。有人能告诉我我在这里想念什么吗?我正在使用 Qt 5.7 和 Android 6.0。

感谢您的帮助...

【问题讨论】:

请注意,在 android 模拟器上,这也可以正常工作。 原因是android上还没有提交文本,更多信息见QInputMethod,尤其是commit 尝试使用displayText 而不是text。前者包括来自输入法的部分文本输入。 或者,如果您不需要预测文本输入,请在TextField 上设置inputMethodHints: Qt.ImhNoPredictiveText 谢谢,现在可以正常使用 displayText。我了解您的其他意见,这对我了解此特定功能非常有价值! 【参考方案1】:

据我了解我的问题的 cmets,我有几种可能性来解决这个问题。最简单的一种是像这样修改我的 QML 项:

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,这是我选择的解决方案。

【讨论】:

以上是关于如何使 QML TextField 绑定在 Android 下工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 QML TextField 中的 placeholderText 颜色

在 Python 中访问 QML TextField 值

如何更改 Qml TextField echoMode Password 显示的星号?

SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为

SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为

如何使 QML 容器中的最后一项填充剩余空间?